Исключения столбцов из Матрицы, где элементы в две строки равны


Есть ли способ, чтобы уменьшить время вычисления в этой программе, что исключает столбцов матрицы A, если для данного столбца элемент строка 4 равна элементу в строке 5:

k=1;
for i=1:4000
   if A(4,i) ~= A(5,i)
      B(:,k)=A(:,i);
      k=k+1;
   end
end


361
1
задан 11 декабря 2011 в 09:12 Источник Поделиться
Комментарии
1 ответ

В общем, вы ускорите программ MATLAB путем вычисления всего вектора или матрицы сразу, а не писать циклы. В этом случае, вы можете создавать "логические" вектор, содержащий 1 в каждом столбце, в котором соответствующий столбец имеет различные значения в строках 4 и 5, и 0 в других столбцах:

selected_columns = A(4, :) ~= A(5, :);

Затем вы хотите собрать всех строк, в Столбцах, где в два ряда бывают разные:

B = A(:, selected_columns);

Я тестировал эту идею в октаву, так как я на самом деле не есть MATLAB:

octave-3.4.0:7> A = [1, 1, 2, 2, 3, 4, 5;1, 2, 3, 2, 1, 4, 5]
A =

1 1 2 2 3 4 5
1 2 3 2 1 4 5

octave-3.4.0:8> selected_columns = A(1, :) ~= A(2, :)
selected_columns =

0 1 1 0 1 0 0

octave-3.4.0:9> B = A(:, selected_columns)
B =

1 2 3
2 3 1

Это не совсем эквивалентно ваш исходный код, но это, наверное, ближе к тому, что вы имели в виду. В частности, если имеет более чем 4000 столбцов, мой код будет включать в себя дополнительную, в то время как Ваш будет их бросить. Мой код тоже не волнует начальное значение B, а твой может включать дополнительные столбцы B, которые не были в А. аналогично, ваш код может перестать работать, если это меньше, чем 4000 столбцов, или если b является слишком узким, чтобы вместить все неравные колонки от А.

4
ответ дан 12 декабря 2011 в 06:12 Источник Поделиться