MATLAB Answers


Can you help me to correct this error?

Asked by Tomas
on 23 Nov 2012

Hi, can you help me to correct this error

[p C]=size(lab)
Lr = L .* ones(p, C);


??? Error using ==> times
Matrix dimensions must agree.
Error in ==> lab at 60
Lr = L .* ones(p, C);





No products are associated with this question.

3 Answers

Answer by Matt Fig
on 23 Nov 2012
Edited by Matt Fig
on 23 Nov 2012

What are p and C?

L = 60;
Lr = L .* ones(3, 5);  % No error...(the .* is not necessary)

You have a variable named lab and a function named lab?? This is a very bad idea and may (somehow) be at the root of your problem....


on 23 Nov 2012
>> whos p C ones
  Name      Size            Bytes  Class     Attributes
    C         1x1                 8  double              
    p         1x1                 8  double              
p =
C =
Matt Fig
on 23 Nov 2012

There is more to the story then. See, this does not error on my machine:

p = 400;
C = 1800;
L = 60.0221;
Lr = L .* ones(p, C);

So I am afraid I am out of ideas here. There is something else going on in the code somewhere, but without seeing the code I cannot say. Someone else may be able to guess the problem.

Walter Roberson
on 24 Nov 2012

Tomas, what are the values of p and C ? And is the error still occurring?

Answer by Walter Roberson
on 24 Nov 2012

Your RGB image is 3 dimensional, not 2 dimensional. Row, Column, Color-plane. Your lab equivalent of the RB is 3 dimensional as well. When you take the size() of a 3 dimensional array, you need to have either only 1 output or else 3 or more outputs. If you only have two outputs as in

[p C]=size(lab)

then p will be assigned the number of rows (as expected) but C will be assigned the product of all the remaining dimensions, and so will be columns times number of color planes.

  1 Comment

Matt Fig
on 24 Nov 2012

That doesn't explain the error, however...

>> clear all
>> rgb=imread('office_2.jpg');    % Image in the IPT
>> cform = makecform('srgb2lab'); % On the FEX
>> lab = applycform(rgb,cform);
>> [p C]=size(lab);
>> % lchan=lab(:,:,1);
>> L=60.0221;
>> Lr = L .* ones(p, C);   % No error....
>> whos
  Name         Size                  Bytes  Class     Attributes
    C            1x1                       8  double              
    L            1x1                       8  double              
    Lr         600x2709             13003200  double              
    cform        1x1                   13376  struct              
    lab        600x903x3             1625400  uint8               
    p            1x1                       8  double              
    rgb        600x903x3             1625400  uint8 

Answer by Image Analyst
on 24 Nov 2012
Edited by Image Analyst
on 24 Nov 2012

Like Walter said, your problem is (partially) that your C is the number of columns TIMES the number of color channels (which is 3). You should be doing it this way, as you'll notice that I ALWAYS do it in code I post, even when I suspect the image is gray level:

[rows columns numberOfColorChannels] = size(lab);

If you do it this way:

[rows columns] = size(lab);

as you did, then columns will not be the number of columns in the image but will be columns * numberOfColorChannels. Please see this blog entry by Steve Eddins for further discussion:

But like Matt said, that wouldn't cause an error if L was just some number like 60. So, I suspect that you actually did something like

L = lab(:, :, 1); % Extract the L color channel.

and then L would have the size rows*columns, but your ones() function would return an array rows*columns*numberOfColorChannels. Hence the sizes don't match up. So I don't know why you said L was 60 when it was not, but that's your problem. I speculate that you'd like to construct a constant luminance image. In that case, you set

Lr = 60 * ones(size(L));

and then you invert the transform to get back to RGB.


Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply today