2017-01-18 3 views
0

Если у меня есть ячейку, содержащую 2 матрицы:Умножение клеточных элементов с вектором в MATLAB

A = {[10 0 0 10 0 20 15; 
     0 10 10 15 0 0 20; 
     10 0 0 12 11 0 0; 
     10 0 0 0 19 0 14; 
     18 13 0 0 0 15 0; 
     0 10 0 0 0 10 15] 
    [ 0 0 10 0 20 15; 
     10 10 15 0 0 20; 
     0 0 12 11 0 0; 
     0 0 0 19 0 14; 
     13 0 0 0 15 0; 
     11 0 13 0 15 0]} 

B = [500 550 600 650 700 550] 

Хочу умножить каждую матрицу с этим вектором таким образом, что первая строка матрицы А умножается на 1 элемент B, второй ряд A со вторым элементом B, ... и 6-й строки A с 6-м элементом B. как определить это, поскольку A является ячейкой?

ответ

1

Вы можете использовать cellfun работать на каждом элементе в A отдельно, а bsxfun умножить каждую строку в матрицах в A одним элементом в B:

celltimes = @(A) bsxfun(@times,A,B.'); 
C = cellfun(celltimes,A,'UniformOutput',false) 

результат:

>> celldisp(C) 
C{1} = 
    Columns 1 through 4 
     5000   0   0  5000 
      0  5500  5500  8250 
     6000   0   0  7200 
     6500   0   0   0 
     12600  9100   0   0 
      0  5500   0   0 
    Columns 5 through 7 
      0  10000  7500 
      0   0  11000 
     6600   0   0 
     12350   0  9100 
      0  10500   0 
      0  5500  8250 
C{2} = 
    Columns 1 through 4 
      0   0  5000   0 
     5500  5500  8250   0 
      0   0  7200  6600 
      0   0   0  12350 
     9100   0   0   0 
     6050   0  7150   0 
    Columns 5 through 6 
     10000  7500 
      0  11000 
      0   0 
      0  9100 
     10500   0 
     8250   0 

Как указано @Adriaan в комментариях, в Matlab 2016b bsxfun неявно что вы можете просто написать:

C = cellfun(@(A) A.*B.',A,'UniformOutput',false); 
+0

Обратите внимание, что в R2016b неявное расширение реализовано в MATLAB, поэтому использование 'bsxfun' больше не требуется. Можете добавить это как решение post-R2016b. – Adriaan

+0

im используя matlabR2013, так что это сработало.thanks –