Своп Matlab - PullRequest
       38

Своп Matlab

4 голосов
/ 15 марта 2009

Я пытаюсь создать функцию, которая будет заменять определенное число в матрице на определенное число в той же самой матрице. Например, если я начну с A = [1 2 3; 1 3 2], я хочу иметь возможность создать B = [2 1 3; 2 3 1], просто сказав matlab поменять 1 на 2. Любой совет будет принят во внимание. Спасибо!

Ответы [ 6 ]

3 голосов
/ 22 марта 2009

Другой способ справиться с исходной проблемой - создать вектор перестановки , указывающий, каким числам следует сопоставлять исходные записи. Например, записи [1 2 3] должны быть соотнесены соответственно с [2 1 3], чтобы мы могли написать

A = [1 2 3; 1 3 2];
perm = [2 1 3];
B = perm(A)

(преимущество здесь в том, что все делается за один шаг, и что это также работает для операций, более сложных, чем свопы; недостатком является то, что все элементы A должны быть натуральными числами с известным максимумом)

3 голосов
/ 15 марта 2009

Если у вас есть следующая матрица:

A = [1 2 3; 1 3 2];

и вы хотите, чтобы все стали по двое, а двое - по одному, самый простой способ сделать это будет следующим:

B = A;
B(find(A == 1)) = 2;
B(find(A == 2)) = 1;

EDIT:

Как предположил Кенни, это может быть еще более упрощено как:

B = A;
B(A == 1) = 2;
B(A == 2) = 1;
2 голосов
/ 16 марта 2009
A = [1 2 3; 1 3 2]

alpha = 1;
beta = 2;

indAlpha = (A == alpha);
indBeta  = (A == beta);

A(indAlpha) = beta;
A(indBeta ) = alpha

Мне нравится это решение, оно проясняет, что происходит. Меньше магических чисел, можно легко превратить в функцию. Повторяет ту же матрицу, если это важно.

2 голосов
/ 15 марта 2009

Не уверен, почему вы должны выполнить этот конкретный обмен (чередование строк / столбцов более распространено). Matlab часто обозначает «:» для представления всего чего-либо. Вот как можно поменять местами строки и столбцы:

Чтобы поменять строки:

A = A([New order of rows,,...], :) 

Чтобы поменять столбцы:

A = A(:, [New order of columns,,...])

Чтобы изменить весь i-й столбец:

A(:, i) = [New; values; for; i-th; column] 

Например, чтобы поменять местами 2-й и 3-й столбцы A = [1 2 3; 1 3 2]

A = A(:, [1, 3, 2]) 
1 голос
/ 15 марта 2009

В отношении более элегантного способа подмены значений Тарна вы можете использовать матрицу перестановок следующим образом:

>> a =[1 2 3];
>> T = [1 0 0;
        0 0 1;
        0 1 0];
>> b = a*T
ans =
    1 3 2

но это поменяет местами столбец 2 и столбец 3 вектора (матрицы) a ; тогда как заданный вопрос об обмене 1 и 2.

Обновление

Чтобы поменять местами элементы двух разных значений, посмотрите в функцию find

ind = find (a == 1);

возвращает индексы всех элементов со значением 1. Затем вы можете использовать предложение Митча , чтобы изменить значение элементов, используя индексные массивы. Помните, что find возвращает линейный индекс в матрицу; первый элемент имеет индекс 1, а последний элемент матрицы nxm имеет линейный индекс n * m . Линейный индекс отсчитывается по столбцам. Например

>> b = [1 3 5;2 4 6];
>> b(3) % same as b(1,2)
ans = 3
>> b(5) % same as b(1,3)
ans = 5
>> b(6) % same as b(2,3)
ans = 6 
1 голос
/ 15 марта 2009

У меня не установлена ​​копия MatLab, но я думаю, что вы можете сделать что-то вроде этого;

for i=1:length(A)
   if (A(i)=1), B(i) = 2, B(i)=A(i) 
end

Обратите внимание, что это только преобразование 1 в 2, и похоже, что вы также хотите преобразовать 2 в 1, так что вам нужно будет сделать немного больше работы.

Там также, вероятно, гораздо более элегантный способ сделать это, учитывая, что вы можете делать такие вещи в Matlab

>> A = 1:1:3
A = [1,2,3]
>> B = A * 2
B = [2,4,6]

Возможно, вы можете использовать примитив swapif, но я давно не использовал Matlab, поэтому не уверен, что это лучший способ сделать это.

...