как избежать цикла, чтобы сократить время вычисления этого кода (одно из решений моего последнего вопроса):
Надеюсь найти векторы столбцов A(1:3,:)
, соответствующие значения которых в M(4,:)
не являются частью одного из векторов ячейки X
(и, очевидно, не равны одному из этих векторов). Я ищу быстрое решение, если X
очень велико.
M = [1007 1007 4044 1007 4044 1007 5002 5002 5002 622 622;
552 552 300 552 300 552 431 431 431 124 124;
2010 2010 1113 2010 1113 2010 1100 1100 1100 88 88;
7 12 25 15 12 30 2 10 55 32 12];
Здесь я беру непосредственно A
:
A = [1007 4044 5002 622;
552 300 431 124;
2010 1113 1100 88];
A
содержит уникальные столбчатые векторы M(1:3,:)
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12]};
[~, ~, subs] = unique(M(1:3,:)','rows');
A4 = accumarray(subs(:),M(4,:).',[],@(x) {x});
%// getting a mask of which columns we want
idxC(length(A4)) = false;
for ii = 1:length(A4)
idxC(ii) = ~any(cellfun(@(x) all(ismember(A4{ii},x)), X));
end
Отображение нужных столбцов
out = A(:,idxC)
Результаты:
>> out
out =
1007 4044
552 300
2010 1113
вектор столбца [5002;431;1100]
был исключен, поскольку [2;10;55]
содержится в X{2} = [2 10 55 9 17]
вектор столбца [622;124;88]
был исключен, потому что [32 12] = X{4}
Другой пример: с тем же X
M = [1007 4044 1007 4044 1007 5002 5002 5002 622 622 1007 1007 1007;
552 300 552 300 552 431 431 431 124 124 552 11 11;
2010 1113 2010 1113 2010 1100 1100 1100 88 88 2010 20 20;
12 25 15 12 30 2 10 55 32 12 7 12 7];
X = {[2 5 68 44],[2 10 55 9 17],[1 55 6 7 8 9],[32 12]};
A = [1007 4044 5002 622 1077;
552 300 431 124 11;
2010 1113 1100 88 20];
Результаты: (с ответом scmg)
Я получаю, если A
сортируется в соответствии с первой строкой: (правильный результат)
out =
1007 1007 4044
11 552 300
20 2010 1113
Если я не сортирую матрицу A
, я получаю: (false result)
out =
4044 5002 622
300 431 124
1113 1100 88
вектор столбца A(:,4) = [622;124;88]
должен быть удален, потому что [32 12] = X{4}
.
вектор-столбец [5002;431;1100]
должен быть исключен, поскольку [2;10;55]
содержится в X{2} = [2 10 55 9 17]