C++ 用C/C+编写MATLAB数组+;
MATLAB代码通过创建一个单元格数组,对灰度图像的C++ 用C/C+编写MATLAB数组+;,c++,c,matlab,C++,C,Matlab,MATLAB代码通过创建一个单元格数组,对灰度图像的背景部分进行采样,该单元格数组是backgroundSample{1},backgroundSample{2}背景示例{9}。这里的halfRows和halfCols是图像的一半大小 因为backgroundSample是一个包含九个二维矩阵的数组。如何用C/C++编写这段代码让我感到困惑。我可以使用类似于backgroundSample[I].elements[m][n]的方法获取backgroundSample{I}的元素吗 MATLAB代
背景
部分进行采样,该单元格数组是backgroundSample{1}
,backgroundSample{2}
<代码>背景示例{9}。这里的halfRows
和halfCols
是图像的一半大小
因为backgroundSample
是一个包含九个二维矩阵的数组。如何用C/C++编写这段代码让我感到困惑。我可以使用类似于backgroundSample[I].elements[m][n]
的方法获取backgroundSample{I}
的元素吗
MATLAB代码:
offset = [-60, -20, 20, 60];
for i = 1: 1: 3
for j = 1: 1: 3
backgroundSample{(i - 1) * 3 + j} =
background(halfRows + offset(i): halfRows + offset(i + 1), ...
halfCols + offset(j): halfCols + offset(j + 1));
end;
end;
编辑:因为我们可以在MATLAB中通过
a=B
简单地分配矩阵。例如,在我的问题中,backgroundSample{1}=background(60:100,60:100)
,这个赋值在i:1的循环中→3和j:1→3.但是,在C/C++中分配矩阵时,它应该逐个分配每个元素。也许是这样:
for(int i = 0; i < 3; i++)
for(int j = 0; n < 3; j++)
// to get every elements
for(int m = 0 ...)
for(int n = 0 ...)
// not sure whether there is such usage of "->" in array
backgroundSample[(i - 1) * 3 + j]->elements[m][n] = background[i iteration][j iteration]
backgroundSample = new TSample[9];
for(int i=0;i<3;i++)
对于(int j=0;n<3;j++)
//获取所有元素
对于(int m=0…)
对于(int n=0…)
//不确定数组中是否有“->”这样的用法
背景样本[(i-1)*3+j]->元素[m][n]=背景[i迭代][j迭代]
因此,矩阵
backgroundSample[m][n]
和background[i][j]
的索引之间存在冲突。如何解决此问题?实现所描述内容的最简单方法是声明多维数组:
int backgroundSample[9][3][3];
其中,假设每个二维矩阵的维数为3×3。要访问第k个矩阵中的(m,n)元素,请编写backgroundSample[k][m][n]
,例如:
然后创建以下内容的数组:
TSample backgroundSample[9];
要访问元素,您需要编写backgroundSample[k].elements[m][n]
还可以动态分配内存(在运行时,这意味着您不知道预先有多少这样的结构):
在C++中,内存分配的实际过程是这样的:
for(int i = 0; i < 3; i++)
for(int j = 0; n < 3; j++)
// to get every elements
for(int m = 0 ...)
for(int n = 0 ...)
// not sure whether there is such usage of "->" in array
backgroundSample[(i - 1) * 3 + j]->elements[m][n] = background[i iteration][j iteration]
backgroundSample = new TSample[9];
访问元素将通过写入backgroundSample[k]->elements[m][n]
来完成。请注意数组操作符->
,它通过取消引用指针backgroundSample[k]
来访问字段元素
注意:每次调用new
时都需要伴随一个匹配的调用delete
,以释放内存,即:
希望有帮助 你是想写一个MEX文件,还是仅仅是一个等效的C/C++程序?@EitanT我正在写一个等效的C/C++程序那么到底是什么问题?声明一个由9个指向二维矩阵的指针组成的数组,并为每个矩阵分配足够的内存。访问第i个矩阵中的元素可能看起来像backgroundSample[i]>elements[j][k]
或者,您可以创建自己的矩阵类,这可以完成Matlab矩阵所能做的一切。所有这些嵌套for循环的内容都将由您的类封装(例如,在GetElement函数中)。@I我添加了更多关于这个问题的描述,请给出一个指向您提到的矩阵的指针示例谢谢,但可能存在一个错误:您的代码backgroundSample[(I-1)*3+j][m][n]=background[I][j]
也应该在i和j的循环中,对吗?因此,通过这种方式,backgroundSample[0][m][n]
将被分配相同的值,因为background[i][j]
在跳出循环m&n之前不会更改。是的,这只是一个用法示例。假设它位于一个嵌套的for循环中,该循环迭代i
和j
,就像假设数组background
是在其他地方定义的一样。显然,您应该根据您的需要对其进行修改。
backgroundSample = new TSample[9];
delete[] backgroundSample;