gpt4 book ai didi

c++ - C/C++ : circular shift on matrices

转载 作者:行者123 更新时间:2023-11-28 06:27:19 27 4
gpt4 key购买 nike

我正在尝试编写一个高效的代码来执行循环移位,在我的数据处理过程中,我需要在大矩阵上多次实现它。

在我的第一次试验中,编译器抛出一些异常,似乎我可能正在尝试访问超出其大小的矩阵元素,但我不知道发生了什么问题。

1) 我也在使用 Armadillo lib,它有 "mat" 定义。2) 我打算按行和/或列移动它。

这是我的尝试:

#include "stdafx.h"
#include <vector>
#include <iostream>
#include "C:\Users\kumar\Documents\Visual Studio 2012\UserLibs\armadillo-3-910-0\include\armadillo"

#include <stdlib.h> /* srand, rand */
using namespace arma;



template<class ty>
void circshift(ty *out, const ty *in, int xdim, int ydim, int xshift, int yshift)
{

int iOutputInd, iInputInd, ii, jj;

for (int i =0; i < xdim; i++)
{
ii = (i + xshift) % xdim;
for (int j = 0; j < ydim; j++)
{
jj = (j + yshift) % ydim;

iOutputInd = ii * ydim + jj;
iInputInd = i * ydim + j;
std::cout << " iOutputInd --> " << iOutputInd << " ; iInputInd -->" << iInputInd << "\n";


out[iOutputInd] = in[iInputInd]; // EXCEPTION BEING THROWN HERE
}
}
}



int _tmain(int argc, _TCHAR* argv[])
{

//a = [1 2 3; 4 5 6; 7 8 9];
mat a, a_out; // "mat" defined in C++ lib Armadillo
a << 1 << 2 << 3 << endr
<< 4 << 5 << 6 << endr
<< 7 << 8 << 9 <<endr;
a.reshape(3,3);
//a.print();

a_out = a;

int xdim = 3; int ydim = 3; int xshift = 1; int yshift = 0;
circshift(&a_out, &a, xdim, ydim, xshift, yshift);
a_out.print();

return 0;
}

它编译得很好。但是,当我尝试运行时,Visual Studio 抛出以下错误:

Unhandled exception at 0x3FF00000 in Circshift_Example.exe: 0xC0000005: Access violation (parameters: 0x00000008).

我在 visual studio 控制台中收到另一个错误,它提示:

error: Mat::init(): requested size is too large

更新:最终解决方案我发布了我的代码,因为它可能对某些用户有用。

请注意,我正在使用“Armadillo”库来创建矩阵。可以用自己的矩阵类替换 Armadillo “垫”类。

如果您使用此代码,请投票。

#include "stdafx.h"
#include "armadillo-3-910-0\include\armadillo"

using namespace arma;


template<class ty>
void circshift(ty& out, const ty& in, int xshift, int yshift)
{
int iOutputInd, iInputInd, ii, jj;
int ydim = in.n_cols;
int xdim = in.n_rows;
for (int j =0; j < ydim; j++)
{
jj = (j + yshift) % ydim;
if (jj <0) jj = jj + ydim;
for (int i = 0; i < xdim; i++)
{
ii = (i + xshift) % xdim;
if (ii <0) ii = ii + xdim;
out[jj * xdim + ii] = in[j * xdim + i];
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{

//a = [1 2 3; 4 5 6; 7 8 9];
mat a, a_out;
a << 1 << 2 << 3 << endr
<< 4 << 5 << 6 << endr
<< 7 << 8 << 9 <<endr;
a.reshape(3,3);

a_out = a;

int xshift = 1; int yshift = 0;
circshift(a_out, a, xshift, yshift);
a_out.print();

xshift = 1; yshift = -1;
circshift(a_out, a, xshift, yshift);
a_out.print();


return 0;
}

最佳答案

这里的主要错误是您将指向 mat 类型对象的指针传递给 circshift() 函数(out in 参数,然后将这些参数用作 mat 的数组。以下行未按照您的想法进行解释

out[iOutputInd] = in[iInputInd];

因为 outin 不是 mat 对象。它们是指向 mat 对象的指针,因此编译器会将 inout 解释为指向 mat 数组的指针并索引这些数组,将不存在的 mat 从 in[...] 复制到另一个不存在的位置。

解决这个问题的一个简单方法是使用引用而不是指针来传递 mat 对象,即:

template<class ty> void circshift(ty& out, const ty& in, int xdim, int ydim, int xshift, int yshift)
{
...
}

并在 _tmain 中调用它:

circshift(a_out, a, xdim, ydim, xshift, yshift);

关于c++ - C/C++ : circular shift on matrices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305054/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com