使用for循环填充向量

时间:2012-07-17 14:15:51

标签: matlab vector for-loop

我有一个解决方案,只为矩阵的一个元素创建一个向量:

[dx,dy] = gradient(Im);
orient11 = [(-dx(1,1)) (dy(1,1)) 0];

,其中

size(orient11) =

0 0 0

即,对于第一个东方元素,即orient11,是一个向量。我如何为所有其他元素执行此操作,因此我有orient12,orient13 .... orientnn。我知道我需要一个for循环,但是我将什么对象存储在for循环中?我发现我无法创建矢量矩阵。

提前致谢。

2 个答案:

答案 0 :(得分:1)

v = -2:0.2:2;
[x,y] = meshgrid(v);
z = x .* exp(-x.^2 - y.^2);
[px,py] = gradient(z,.2,.2);

orient11 = [(-px(1,1)) (py(1,1)) 0]; % based off of your concatination there.
size(orient11)
然后我得到:

ans =

     1     3

如果你想从你拥有的渐变中抓取第一列数据并想要用它们堆叠零,你可以这样做:

orient11 = [(-px(:,1)) (py(:,1)) zeros(size(px,1),1)];

而不是for循环。

更新

Orient = zeros(size(px,1),3,size(px,2));
for n = 1:size(px,1)
    Orient(:,:,n) = [(-px(:,n)) (py(:,n)) zeros(size(px,1),1)];
end

Orient的布局现在是你的-px,py,0层。每个图层代表初始数据中的列。因此,如果您想访问第4行第14列,请拨打Orient(4,:,14)

希望有意义并有所帮助!

答案 1 :(得分:1)

可以尝试构建 N -by- N -by-3矩阵,但操作起来不会那么方便。这是因为从该矩阵中提取向量将产生1乘1乘3的向量,您需要重新整形。绝对不好玩。

相反,我建议你构建一个3乘1矢量的 N -by- N cell array,如下所示:

[dx, dy] = gradient(Im);
vec = @(i)[-dx(i), dy(i), 0];
orient = arrayfun(vec, reshape(1:numel(dx), size(dx)), 'UniformOutput', 0);

要访问矢量,请使用花括号。例如,(1,2)位置的矢量将是:

orient12 = orient{1, 2};

希望它有所帮助!