2013-04-19 3 views
5

Я заметил различные случаи в Matlab и октаве, где функции принимают как матрицы, так и векторы, но не делают то же самое с векторами, как и с матрицами.Октава и Matlab «wat» матричные/векторные несоответствия

Это может вызывать разочарование, поскольку, когда вы вводите матрицу с переменным числом строк/столбцов, ее можно интерпретировать как вектор и делать то, чего вы не ожидаете, когда высота/ширина составляет 1 для сложной отладки и странные условные краевые случаи.

Я перечислю несколько я нашел, но мне интересно, что другие люди столкнулись с

(Примечание:. Я ищу только в тех случаях, когда код, принимает матрицы в качестве действительного ввода Все, что вызывает исключение, когда не-вектор матрицы дается в качестве аргумента не учитывается)

1) «Diag» может быть использован для обозначения диагонали матрицы или повернуть вектор в диагональную матрицу

поскольку первый, как правило, используется только для квадратных матриц, это не так вопиюще в Matlab, но в Octave это может быть особенно болезненно, когда Октав взаимодействует с ve т х р начало с ненулевым элементом, а все остальные нулей как «диагональная матрица», т.е.

t=eye(3); 
size(diag(t(:,3))) == [3,3] 
size(diag(t(:,2))) == [3,3] 
size(diag(t(:,1))) == [1,1] 

2) Индексация в вектор-строки с логическими выражениями она возвращает вектор-строки

индексирование во что-нибудь еще с логическими выражениями возвращаются вектор-столбец

a = 1:3; 
b = true(1,3); 
size(a(b)) == [1, 3] 
a = [a; a]; 
b = [b; b]; 
size(a(b)) == [6, 1] 

3) Индексирование в вектор V с векторным индексом я возвращает вектор того же (строка/COL) типа, как ст. Но если либо в или я матрица, возвращаемое значение имеет тот же размер, что и i.

a = 1:3; 
b = a'; 
size(a(b)) == [1, 3] 
b = [b,b]; 
size(a(b)) == [3, 2] 

4) макс, мин, сумма и т.д. действуют на столбцах матрицы M individiually, если М 1xN в этом случае они не действуют на М как единый вектор-строка

a = 1:3 
size(max(a)) == [1, 1] 
a = [a;a] 
size(max(a)) == [1, 3] 

макс особенно плохо, поскольку он не может даже принять измерение в качестве аргумента (в отличие от суммы)

Какие еще такие случаи следует учитывать при написании кода октавы/матлаба?

+0

только для уточнения: вы можете указать размер для max/min: 'min (rand (3), [], 1)' или 'max (rand (3), [], 2)' – Amro

ответ

1

Каждый язык имеет свои концепции. Важным моментом этого языка является очень часто думать о матрицах как массиве векторов, каждый столбец - записи. Тогда это станет иметь смысл. Если вы не хотите этого поведения, используйте matrix(:) в качестве аргумента для тех функций, которые передают один вектор, а не матрицу. Например:

octave> a = magic (5); 
octave> max (a) 
ans = 

    23 24 25 21 22 

octave> max (a(:)) 
ans = 25 

1) Это не соответствует, по крайней мере, Octave 3.6.4. Я не уверен на 100%, но может быть связан с this bug, который уже исправлен.

2) Если вы индексируете с булевыми значениями, он будет считаться маской и рассматриваться как таковой. Если вы индексируете небулевые значения, тогда они рассматриваются как индексы для значений. Это имеет для меня смысл.

3) Это неправда. Возвращаемый всегда имеет одинаковый размер индекса, независимо, если он является матрицей или вектором. Единственное исключение состоит в том, что если индекс является вектором, выход будет иметь одну строку.Идея заключается в том, что индексация с одного вектора/матрицы возвращает что-то такого же размера:

octave> a = 4:7 
a = 

    4 5 6 7 

octave> a([1 1]) 
ans = 

    4 4 

octave> a([1 3]) 
ans = 

    4 6 

octave> a([1 3; 3 1]) 
ans = 

    4 6 
    6 4 

4) max делает принять измерение в качестве аргумента, по крайней мере в октаву. Из справочного текста 3.6.4 из max:

Для векторного аргумента верните максимальное значение. Для аргумента матрицы возвращайте максимальное значение из каждого столбца в виде вектора строки, или по размеру DIM, если оно определено, и в этом случае Y должно быть установлено в пустую матрицу (в противном случае она игнорируется).

Остальное действует, как я сказал во вступительном слове. Если вы поставите матрицу, она будет рассматривать каждый столбец как набор данных.

+2

Я не подумайте, что вы поняли, о чем я спрашивал. Я вообще жаловался, что векторы не рассматриваются как матрицы (тогда как вы, казалось, думали, что моя проблема в том, что матрицы не рассматриваются как векторы) В случае 2, я только индексируюсь с булевыми, никогда с числами (не в любом случае), но один возвращает вектор строки, а другой - вектор-столбец. В случае 3 исключение, о котором вы говорите, именно то, о чем я жалуюсь. Если у меня есть матрица, которую мне нужно индексировать, но матрица имеет переменное количество столбцов, тогда я должен написать оператор if для этого единственного исключения только с 1 – dspyz

0

1) Как указал другой пользователь, это не верно в Octave> = 3.6.4.

В случае 2) правило для векторов, возвращать всегда ту же форму вектора, для чего другого возвращает вектор-столбец, рассмотрим:

>> a = reshape (1:3, 1,1,3) 

a(:,:,1) = 

    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 

>> b = true(1,3) 

b = 

    1×3 logical array 

    1 1 1 

>> a(b) 

ans(:,:,1) = 

    1.0000e+000 


ans(:,:,2) = 

    2.0000e+000 


ans(:,:,3) = 

    3.0000e+000 

>> a = [a;a] 

a(:,:,1) = 

    1.0000e+000 
    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 
    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 
    3.0000e+000 

>> b = [b;b] 

b = 

    2×3 logical array 

    1 1 1 
    1 1 1 

>> a(b) 

ans = 

    1.0000e+000 
    1.0000e+000 
    2.0000e+000 
    2.0000e+000 
    3.0000e+000 
    3.0000e+000 

Вы можете видеть, что это имеет смысл, так как векторы имеют clear 'direction', но другие формы матрицы не при удалении элементов. EDIT: на самом деле я только что проверил, и Октав, похоже, не работает именно так, но, вероятно, должен.

3) Это согласуется с 2). По сути, если вы укажете список индексов, направление индексированного вектора сохранится. Если вы снабжаете индексы формой, подобной матрице, то используется новая информация - форма матрицы индекса. Это более гибко, так как вы всегда можете сделать a(b(:)), чтобы сохранить форму a, если хотите. Вы можете сказать, что это непротиворечиво, но помните, что индексирование с помощью логических элементов может уменьшить количество возвращаемых элементов, поэтому они не могут быть изменены таким образом.

4) Как указано в комментарии, вы можете указать размер для max/min для работы: min(rand(3),[],1) или max(rand(3),[],2), но в этом случае есть проблемы с «устаревшими» с этими функциями, данные которых когда-то были первыми и теперь их очень сложно изменить, не нарушая людей.

Смежные вопросы