2014-11-29 4 views
2

Я не смог сэкономить значение BB в Bv.Несоответствие размеров матрицы

MATLAB возвращает эту ошибку:

Subscripted assignment dimension mismatch.

Пожалуйста, помогите мне сделать это.

X=[1 6 9 5; 6 36 54 30; 9 54 81 40; 5 30 40 25] 

     [N1,dim1]=size(X) ; 
     for i=1:N1 
      bb=X(i:end,1)*X(i,i:end); 
      BB=bb(triu(true(size(bb)))) 
      Bv(i,:)=BB(:); 

     end 
+0

Потому что 'BB' изменяет размер на каждой итерации. – Rashid

+0

@ Камтал вы правы, но как сохранить значение BB? –

+0

Вы можете использовать 'Bv {i,:} = BB (:);' – Rashid

ответ

2

Как @Rashid предлагает использовать массивы ячеек вместо числовых массивов. Красота клеточных массивов заключается в том, что он может хранить матрицы различного типа и размера в 1 ячейке памяти. Он очень похож на структуру, но с индексами легко вызывать записи.

X=[1 6 9 5; 6 36 54 30; 9 54 81 40; 5 30 40 25]; 

    for ii=1:size(x,1) 
     bb=X(ii:end,1)*X(ii,ii:end); 
     BB=bb(triu(true(size(bb)))) 
     Bv{ii,:}=BB(:); 
    end 

Обратите внимание, что я также изменил свой индекс цикла, чтобы использовать ii в отличие от i см here. i - это мнимое устройство и для предотвращения ошибок лучше не перезаписывать встроенные функции.

Просто пример того, как массив ячеек хранит различные типы данных и размеры:

A = magic(2); % 2x2 double 
B = uint8(magic(3)); % 3x3 uint8 
C = 'hello world'; % string 

YourCell{1} = A; 
YourCell{2} = B; 
YourCell{3} = C; 

YourCell = 

    [2x2 double] [3x3 uint8] 'hello world' 

То же самое, но теперь в качестве структуры:

YourStruct.magic2double = A; 
YourStruct.magic3uint8 = B; 
YourStruct.MyString = C; 

YourStruct = 

    magic2double: [2x2 double] 
    magic3uint8: [3x3 uint8] 
    MyString:  'hello world' 

Ячейка и структура содержит ту же самую информацию, но для информации в ячейке вы вызываете YourCell{ii}, в то время как в структуре вы должны позвонить YourStruct.variablename. К ячейке можно получить доступ путем индексирования, структура не может. Для структуры, однако, вы можете использовать простые имена, чтобы помнить, что вы храните в каждом элементе, в то время как это невозможно для ячейки.