c语言实现matlab-circshift函数

其实cuda中取余并没有问题(写过示例,打印出来看过);但是不知道为什么放点源,出来的波形是阶梯状的并且居然没有发散——这是个十分严肃又恐怖的问题

所以学长反问我可不可以用circshift函数去做,所以就写了一下,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include<iostream>

void circshift(int* out, int* in, int xdim, int ydim, int zdim, int xshift, int yshift, int zshift)
{
	for (int k = 0; k < zdim; k++) {
		int kk = (k + zshift) % zdim;

		for (int j = 0; j < ydim; j++) {
				int jj = (j + yshift) % ydim;

				for (int i = 0; i < xdim; i++) {
					int ii = (i + xshift) % xdim;

					int tid = kk * xdim * ydim + jj * xdim + ii;
					int tid2 = k * xdim * ydim + j * xdim + i;
				out[tid] = in[tid2];
			}
		}
	}

}

int main()
{ 
    int xdim = 3;
    int ydim=4;
	int zdim = 5;
	int xshift = 0;
	int yshift = 0;
	int zshift = zdim-1;
     int n = xdim* ydim*zdim; 
	int size1 = n * sizeof(int);
	int* a = (int*)malloc(size1);
	int* b = (int*)malloc(size1);
	int i, j;
 
	for (i = 0; i <n; i++)
		a[i]=i;
	printf("before cirshift\n");

	for (int k = 0; k < zdim; k++) {
		for (int j = 0; j < ydim; j++) {
			for (int i = 0; i < xdim; i++) {
				int tid2 = k * xdim * ydim + j * xdim + i;
				printf("%3d", a[tid2]);
			}
			printf("\n");
		}
		printf("\n");
	}

	//for (i = 0; i < xdim; i++) {
	//	for (j = 0; j < ydim; j++) {
	//		int tid = i * ydim + j;
	//		printf("%3d", a[tid]);
	//	}
	//	printf("\n");
	//}

	circshift(b,a, xdim, ydim, zdim, xshift, yshift, zshift);
	printf("after cirshift\n");
	for (int k = 0; k < zdim; k++) {
		for (int j = 0; j < ydim; j++) {
			for (int i = 0; i < xdim; i++) {
				int tid2 = k * xdim * ydim + j * xdim + i;
				printf("%3d", b[tid2]);
			}
			printf("\n");
		}
		printf("\n");
	}


	//for (i = 0; i < xdim; i++) {
	//	for (j = 0; j < ydim; j++) {
	//		int tid = i * ydim + j;
	//		printf("%3d", b[tid]);
	//	}
	//	printf("\n");
	//}
	//
	return 0;
}

中间注释的是先写了个2D的数组看看情况,2D,3D都差不多
其中,以z方向为例,zshift = 1,或者zshift = zdim+1,是一样的结果
在这里插入图片描述
在这里插入图片描述
zshift = zdim-1
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值