MATLAB: How do I fix subscripted assignment dimension mismatch?

MATLAB: How do I fix subscripted assignment dimension mismatch?

The line:

new_img(rows,cols,:) = curMean;

will only work if rows and cols are scalar values. If they are vectors, there are a few options you have to perform the assignment correctly depending on exactly what sort of assignment you are doing. As Jonas mentions in his answer, you can either assign values for every pairwise combination of indices in rows and cols, or you can assign values for each pair [rows(i),cols(i)]. For the case where you are assigning values for every pairwise combination, here are a couple of the ways you can do it:

  • Break up the assignment into 3 steps, one for each plane in the third dimension:
    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
    

    You could also do this in a for loop as Jonas suggested, but for such a small number of iterations I kinda like to use an unrolled version like above.

  • Use the functions RESHAPE and REPMAT on curMean to reshape and replicate the vector so that it matches the dimensions of the sub-indexed section of 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]);
    

For an example of how the above works, lets say I have the following:

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

Either of the above solutions will give you this result:

>> 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

Be careful with such assignments!

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

In other words, you assign all combinations of row and column indices. If thats what you want, writing

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

should get what you want (as @gnovice suggested).

However, if rows and cols are matched pairs (i.e. youd only want to assign 1 to elements (1,1) and (3,3) in the above example), you may be better off writing

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

MATLAB: How do I fix subscripted assignment dimension mismatch?

Related Posts

Leave a Reply

Your email address will not be published.