MATLAB:如何修复下标分配维度不匹配?

时间:2011-01-25 17:21:57

标签: matlab

new_img ==>

new_img = zeros(height, width, 3); 

curMean是这样的:[double, double, double]

new_img(rows,cols,:) = curMean;

所以这里有什么问题?

2 个答案:

答案 0 :(得分:3)

该行:

new_img(rows,cols,:) = curMean;

仅在rowscols为标量值时才有效。如果它们是向量,则有一些选项可以正确执行赋值,具体取决于您正在执行的赋值类型。如Jonas mentions in his answer,您可以为rowscols中的每个成对索引组合分配值,也可以为每对[rows(i),cols(i)]分配值。对于为每个成对组合分配值的情况,您可以通过以下几种方式进行操作:

  • 将分配分为3个步骤,第三个维度中的每个平面一个:

    new_img(rows,cols,1) = curMean(1);  %# Assignment for the first plane
    new_img(rows,cols,2) = curMean(2);  %# Assignment for the second plane
    new_img(rows,cols,3) = curMean(3);  %# Assignment for the third plane
    

    您也可以在for循环中以Jonas suggested执行此操作,但对于如此少量的迭代,我有点像使用上面的“展开”版本。

  • 使用curMean上的RESHAPEREPMAT功能重新整形和复制矢量,使其与new_img的子索引部分的尺寸相匹配:

    nRows = numel(rows);  %# The number of indices in rows
    nCols = numel(cols);  %# The number of indices in cols
    new_img(rows,cols,:) = repmat(reshape(curMean,[1 1 3]),[nRows nCols]);
    

有关上述方法如何运作的示例,请假设我有以下内容:

new_img = zeros(3,3,3);
rows = [1 2];
cols = [1 2];
curMean = [1 2 3];

上述任何一种解决方案都会给你这个结果:

>> new_img

new_img(:,:,1) =

     1     1     0
     1     1     0
     0     0     0

new_img(:,:,2) =

     2     2     0
     2     2     0
     0     0     0

new_img(:,:,3) =

     3     3     0
     3     3     0
     0     0     0

答案 1 :(得分:2)

小心这样的作业!

a=zeros(3);
a([1 3],[1 3]) = 1
a =
     1     0     1
     0     0     0
     1     0     1

换句话说,您指定了行索引和列索引的所有组合。如果那就是你想要的,写作

for z = 1:3
   newImg(rows,cols,z) = curMean(z);
end

应该得到你想要的东西(建议@gnovice)。

但是,如果rowscols是匹配的对(即您只想在上面的示例中为元素(1,1)(3,3)分配1),那么写作可能会更好

for i=1:length(rows)
    newImg(rows(i),cols(i),:) = curMean;
end