Колонка за колонкой произведение: размеры матрицы должны совпадать - PullRequest
0 голосов
/ 05 октября 2018

У меня есть матрица A в MATLAB и вектор целых чисел B.Затем я создаю матрицу D, удаляя столбцы A, индексированные тем же целым числом в B, и заменяя их одним нулевым столбцом.У меня есть вопрос, касающийся кода, который я использую для построения D, поскольку он работает в MATLAB R2017b, но не в MATLAB R2015b.

Позвольте мне объяснить лучше на примере:

b=8;
g=3;

B=[1;2;2;2;3;4;4;5]; %bx1
bnew=size(unique(B),1);

A=[1  2  3  4  5  6  7  8;
   9  10 11 12 13 14 15 16;
   17 18 19 20 21 22 23 24]; %gxb

Матрица B сообщает нам, какие столбцы A должны быть удалены и заменены столбцом нулей.Например: второй, третий и четвертый элементы B равны;это означает, что второй, третий и четвертый столбцы A должны быть удалены, а один столбец нулей должен быть добавлен.

Следовательно,

D=[1  0  5   0  8;
   9  0  13  0  16;
   17 0  21  0  24]; %gxbnew

Для построения D Я делаю следующее:

C=sparse(1:numel(B),B,1); 
E = A * C;
D= E .* (sum(C) <= 1); 

Обратите внимание: важно рассматривать C,E,D как разреженные, потому что в моем случае они очень большие.В этом отношении, например, можно подумать о получении D, выполнив

C=sparse(1:numel(B),B,1); 
D = E;
D(:, sum(C) > 1) = 0;

, но я не хочу этого, поскольку он невероятно медленнее.


Вопрос: Когда я запускаю

C=sparse(1:numel(B),B,1); 
E = A * C;
D= E .* (sum(C) <= 1); 

в MATLAB R2017b, он работает отлично, но когда я запускаю его в MATLAB R2015b, он не нравитсяпоследняя строка и дает в качестве ошибки

Error using .*
Matrix dimensions must agree. 

Как я могу решить эту сохраняющую эффективность?

1 Ответ

0 голосов
/ 05 октября 2018

Проблема в том, что ваш код основан на широковещательном / неявном расширении в R2017b, что было представлено в R2016b.Если вы попробуете вещание в более старых версиях, вы получите ошибки измерения.Вот почему [1 2] + [1;2] ошибок в pre-R2016b, но работает в более поздних версиях и дает матрицу 2 на 2.Решение, как Сардар Усама прокомментировал для использования bsxfun, что означает Binary Singleton eXpansion FUNction , что означает, что оно делает то же самое, что и неявное расширениекоторый теперь включен по умолчанию.

A = [1 2]; % 1x2
B = [3;4]; % 2x1
C = B*A; % 2x2 matrix in post-R2016b, dimension error in pre-R2016b
D = bsxfun(@times,B,A); % Working pre-R2016b

Если вы хотите, чтобы ваш код работал в обеих версиях, используйте bsxfun или, альтернативно, оберните его в блок try/catch:

try % try implicit expansion
    C = B*A;
catch % if that fails, use bsxfun
    C = bsxfun(@times,B,A);
end

Ссылаясь на документацию bsxfun:

В MATLAB® R2016b и более поздних версиях встроенные двоичные функции, перечисленные в этой таблице, независимо поддерживают неявное расширение.С помощью этих функций вы можете напрямую вызывать функцию или оператор вместо использования bsxfun.Например, вы можете заменить C = bsxfun(@plus,A,B) на A+B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...