У меня есть переменная матрица:

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
1
user3752566 7 Сен 2016 в 11:35

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)

0
NLindros 7 Сен 2016 в 10:22

Вот решение, в котором я использую цикл 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]
0
obchardon 7 Сен 2016 в 10:28