У меня есть переменная матрица:
A = [1 2 8 8 1
4 6 8 1 1
5 3 1 1 8];
И у меня есть переменная B:
B=[2 3 1 8 8];
Вопрос в том, как найти строки и столбцы (сортировать по строкам) в переменной A из переменной B.
Например, первый индекс в переменной B равен 2, а затем я хочу найти значение 2 в переменной A и перейти к первым строкам и столбцам, а затем выполнить процесс до индекса 5, но если строки и столбцы были использованы, получите вторую позицию (например, индекс 4 и 5 имеют одинаковое значение).
rows;
columns;
Результат:
rows = 1 3 1 1 1
columns = 2 2 1 3 4
2 ответа
Используйте find
. Функция может возвращать как линейный индекс, так и индекс строки / столбца.
Используя линейный индекс, решение может быть
idx = zeros(size(B));
for i = 1:numel(B)
% Find all indexes
tmpIdx = find(A == B(i));
% Remove those already used
tmpIdx = setdiff(tmpIdx, idx);
% Get the first new unique
idx(i) = tmpIdx(1);
end
% Convert index to row and col
[rows, cols] = ind2sub(size(A),idx)
Предоставление :
rows = 1 3 1 1 2
cols = 2 2 1 3 3
Обратите внимание, что по мере того, как линейная индексация идет вниз столбец за столбцом, результат здесь отличается от результата в вашем примере (хотя по-прежнему правильный индекс)
rows = 1 3 1 1 1
columns= 2 2 1 3 4
Но чтобы получить это, вы можете просто транспонировать матрицу A (A.'
) и перевернуть строки и столбцы (результат из ind2sub
)
Вот решение, в котором я использую цикл for, я попытался оптимизировать количество итераций и вычислительные затраты. Если между B и A нет соответствующего значения, индекс строки / столбца вернет NaN.
[Bu,~,ord] = unique(B,'stable');
% Index of each different values
[col,row] = arrayfun(@(x) find(A'==x),Bu,'UniformOutput',0)
% For each value in vector B we search the first "non already used" corresponding value in A.
for i = 1:length(B)
if ~isempty(row{ord(i)})
r(i) = row{ord(i)}(1);
row{ord(i)}(1) = [];
c(i) = col{ord(i)}(1);
col{ord(i)}(1) = [];
else
r(i) = NaN;
c(i) = NaN;
end
end
РЕЗУЛЬТАТ:
c = [2 2 1 3 4]
r = [1 3 1 1 1]
Похожие вопросы
Новые вопросы
matlab
MATLAB - это высокоуровневая языковая и интерактивная среда программирования для численных расчетов и визуализации, разработанная MathWorks. Не используйте оба тега [matlab] и [octave], если явно не задан вопрос о сходстве или различии между ними. При использовании этого тега, пожалуйста, укажите версию MATLAB, с которой вы работаете (например, R2017a).