MATLAB代码通过创建为background
,backgroundSample{1}
,...,backgroundSample{2}
的单元格数组对灰度图像的backgroundSample{9}
部分进行采样。此处halfRows
和halfCols
是图像的一半大小。
由于backgroundSample
是包含九个2-D矩阵的数组。我很困惑如何用C / C ++编写此代码。我可以使用类似backgroundSample{i}
的方法获取backgroundSample[i].elements[m][n]
的元素吗?
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[m][n]
和background[i][j]
的索引之间存在冲突。该如何解决? 最佳答案
实现所描述内容的最简单方法是声明多维数组:
int backgroundSample[9][3][3];
假设每个二维矩阵的尺寸为3×3。要访问第k个矩阵中的(m,n)元素,请编写
backgroundSample[k][m][n]
,例如:for (int m = 0; m < 3; ++m)
{
for(int n = 0; n < 3; ++n)
{
backgroundSample[(i - 1) * 3 + j][m][n] = background[i][j];
}
}
或者,如果此数组中的每个样本存储更多信息,则可以声明一个结构:
typedef struct
{
int elements[3][3];
// More fields...
} TSample;
然后创建以下数组:
TSample backgroundSample[9];
要访问元素,您可以编写
backgroundSample[k].elements[m][n]
。还可以动态分配内存(在运行时,这意味着您不知道预先拥有多少这些结构):
TSample* backgroundSample;
在C ++中,内存分配的实际过程如下所示:
backgroundSample = new TSample[9];
通过编写
backgroundSample[k]->elements[m][n]
可以访问元素。注意,通过取消引用指针->
来访问字段elements
的数组运算符backgroundSample[k]
。注意:每次对
new
的调用都需要伴随对delete
的匹配调用以释放内存,即:delete[] backgroundSample;
希望有帮助!
关于c++ - 用C/C++编写MATLAB数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18354062/