2015-11-25 3 views
2

Я прочитал интересную статью о правильном использовании памяти в MATLAB. Вот оно: Link at official website И вот я вижу пример:Ошибка MATLAB вручную?

Если данные содержат много нулей, рассмотреть вопрос об использовании разреженных массивов, которые магазин только ненулевые элементы. В следующем примере сравнивается пространство , необходимое для хранения массива в основном нулей:

A = diag(1e3,1e3); % Full matrix with ones on the diagonal 
As = sparse(A)  % Sparse matrix with only nonzero elements 

Я пытался реализовать в своем коде и найти интересный момент: A = diag(1e3,1e3) не создают матрицу с единицами на диагонали ! Он создает матрицу нулей только с одним ненулевым элементом:

clear A 
A = diag(1e3,1e3); 
find(A); 
ans = 
    1001001 

A(1001001) 
ans = 
     1000 

Ok. Я читал о diag функцию помощи и увидеть это:

D = Diag (v) возвращает квадратную диагональную матрицу с элементами вектора V на главной диагонали.

Ok! Поэтому он действительно не создает диагональную матрицу, если v состоит из 1 элемента! Это ошибка при помощи? НО. Еще один вопрос: почему он работает таким образом?

diag(5,5) 
ans = 
    0  0  0  0  0  5 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 

Я ожидаю, чтобы получить матрицу 5х5 с 5 значением в точке (1,1) или (5,5). Почему он создает матрицу 6x6 и почему 5 является элементом (1,6)?


Некоторое время назад они исправляют документацию: enter image description here

ответ

3

Руководство: diag вы используете 2-й перегруженную версию DIAG:

D = DIAG (v, к) размещает элементы вектора V на k-й диагонали. k = 0 представляет собой главную диагональ, k> 0 находится над главной диагональю, а k < 0 находится ниже главной диагонали.

Итак, ваша команда A = diag (5,5) построит матрицу, где диагональные элементы 5-й диагонали над главной диагональю будут равны вектору [5]. Таким образом, полученное значение, когда только A (1,6) имеет значение.

Если вы хотите иметь 1e3x1e3 матрица с единицами по диагонали попробовать

A = diag(ones(1,1e3)); 
+0

AH, конечно же, обязательно! Глупая ошибка! Но как насчет помощи? Это действительно ошибка? –

+0

Где это было бы ошибкой? это явно, как описано там. У меня есть опечатка в моем ответе, хотя она должна быть A (1,6) не A (1,5). Это связано с тем, что основная диагональ считается равной 0. поэтому пятая диагональ начинается с индекса A (1,6) –

+0

Да, я понимаю. Но посмотрите на это: 'A = diag (1e3,1e3); % Полная матрица с единицами по диагонали. Он не имеет диагоналей. –

1

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

A = diag(1e3,1e3); % Full matrix with ones on the diagonal 
As = sparse(A)  % Sparse matrix with only nonzero elements 
whos 
    Name  Size     Bytes Class 

    A  1001x1001    8016008 double array 
    As  1001x1001    4020  double array (sparse) 

Этот пример, безусловно, не так, вероятно, должно быть:

A=eye(1e3,1e3) 
As=sparse(A); 

, которая создает матрицу 1000x1000 с единицами на главной диагонали.

Эта ошибка сообщается MathWorks

2

В статье неверна.

A = diag(1e3,1e3); 

не производит матрицу с единицами по диагонали. Вместо этого следует читать код:

A = eye(1e3,1e3); 
+0

Спасибо! Можете ли вы мне посоветовать сейчас: я хочу принять ответ, но половина из них - ваш ответ, а половина его - в ответе @FirefoxMetzger :) Какой из них мне нужно выбрать? –

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