2015-05-26 2 views
0

Я пытаюсь создать цикл, который читает через матрицу (A), и сохраняет ненулевые значения в новую матрицу (w). Я не уверен, что не так с моим кодом.Сохранение ненулевых целых чисел из одной матрицы в другую

function [d,w] = matrix_check(A) 
[nrow ncol] = size(A); 
total = 0; 
for i = 1:nrow 
    for j = 1:ncol 
     if A(i,j) ~= 0 
      total = total + 1; 
     end 
    end 
end 
d = total; 
w = []; 
for i = 1:nrow 
    for j = 1:ncol 
     if A(i,j) ~= 0 
      w = [A(i,j);w]; 
     end 
    end 
end 

Второй контур не работает (по крайней мере, он не распечатывает результаты w).

+0

Используйте [отладчик от Matlab] (http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features. html), чтобы просмотреть свой код и посмотреть, как он течет. – excaza

+0

Эта функция отлично работает для меня, вы вызываете 'matrix_check' с двумя объявленными выходами? например '[d, w] = matrix_check (A)' – excaza

+0

Да, я просто пытаюсь понять, почему мой вывод - это всего лишь одно значение. Это не печатает ничего для w, просто d. – statsguyz

ответ

1

Второй цикл работает. Я предполагаю, что вы делаете:

>> matrix_check(A) 

И не:

>> [d, w] = matrix_check(A) 

MATLAB будет возвращать только первый выход, если не указано иное.

Как в стороне, вы можете выполнить свою задачу, используя MATLAB's logical indexing и воспользоваться преимуществами (намного быстрее, обычно) операций массива, а не циклов.

d = sum(sum(A ~= 0)); 
w = A(A ~= 0); 
2

Вы можете использовать nonzeros и nnz:

w = flipud(nonzeros(A)); %// flipud to achieve the same order as in your code 
d = nnz(A); 
+1

Doh! Конечно, для этого есть встроенные модули. Незначительная настройка, у вас есть 'd' и' w' flipped. – excaza

+0

@excaza Спасибо! Исправленный –

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