У меня есть матрица 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.
Как я могу решить эту сохраняющую эффективность?