2013-11-01 4 views
0

Моего кода работает с такого родом структурыразница между аналогичными разреженными структурами

K>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf 

mlf = 

        (1,1)      1 

но он терпит неудачу с таким родом входы ниже, где я выбираю условие в МЗФЕ, которые больше нуля (я не могу понять, как это выбор делает ввод разным)

K>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf(mlf>0) 

ans = 

    (1,1)  1 

где единственное визуальное отличие - это некоторые вкладки/пробелы.

Пожалуйста, объясните, как они отличаются.

+1

Первая команда печатает всю матрицу, а вторая команда печатает ее часть (обратите внимание, что 'mlf (mlf> 0)' - новая анонимная переменная). Моя * догадка * заключается в том, что 'disp'' разреженного' учитывает, что максимальный индекс в нем может быть '(2147483649,1)', на который 'disp' корректирует свой интервал. Анонимная переменная имеет больше доступной информации (например, она составляет всего 1 элемент), поэтому * ее '' disp' будет иметь меньшее расстояние. Также как общий интерес: как и почему ваш код зависит от * отображаемой * версии «разреженной»? –

+0

Ах, нет, я неправильно понял ваш вопрос (просто освежился). Как я уже сказал, 'mlf' является' 2147483649x1' разреженным с 1 заполненным значением, тогда как 'mlf (mlf> 0)' является новой анонимной переменной размером 1x1 (все еще «разреженной»). Введите 'whos ans' после последней команды, чтобы проверить это. –

+0

@RodyOldenhuis Команда не показывает разницы: http://stackoverflow.com/a/19735613/164148 – hhh

ответ

2

Я думаю, что ответ является размер результирующего массива, как Rody предложил:

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; size(mlf(mlf>0)) 
ans = 
    1  1 
>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; size(mlf) 
ans = 
       2147483649       1 

* EDIT 1: Индексация работает правильно:

>> mlf(mlf>0) = 2 
mlf = 
        (1,1)      2 

Это функционально эквивалентно использованию find

>> mlf(find(mlf)) = 2 
mlf = 
        (1,1)      2 

Похоже, что хороший вывод о том, что display форматирует выход с достаточным пространством для элемента в (2147483649,1), , но только при индексировании для назначения этому элементу (думаю, lvalue vs rvalue).

* EDIT 2: Если вы собираетесь после этих элементов в полном (не разреженный) переменной, используйте full:

>> full(mlf(mlf>0)) 
ans = 
    1 

* EDIT 3: Для того, чтобы назначить до последнего элемента в соответствии с размеры mlf, а не до последнего ненулевого элемента,

>> mlf(numel(mlf))=77 
mlf = 
        (1,1)      1 
     (2147483649,1)      77 

* EDIT 4 : Для того, чтобы удалить отрицательные значения:

mlf(mlf<0)=0; % or mlf(find(mlf<0)) = 0; 

Если вы хотите, чтобы сделать копию и удалить негативы:

mlf2 = mlf; 
mlf2(mlf2<0) = 0; 
mlf3 = mlf; 
mlf3(mlf3>0) = 0; 

Тогда у вас есть mlf со всеми значениями, mlf2 только с позитивов и mlf3 только с негативов , Ключевым моментом в этом является то, что размер остается таким же, как у оригинала mlf, поэтому вы можете использовать такие вещи, как end, оригинальным способом, основанным на размере разреженного, ура!

+0

@hhh Тогда я запутался в проблеме. Он работает так, как ожидалось. Что должно быть иначе? Кстати, вы можете использовать 'nonzeros (mlf)', если вы просто хотите не-нули. – chappjc

+0

Можете ли вы показать, что происходит с ошибкой? Благодарю. – chappjc

+0

** [Обновить] ** Теперь я вижу свою ошибку! Это связано с 'mlf = разреженным ([], [], [], 2^31 + 1,1); MLF (1) = 1; MLF = MLF (MLF> 0); mlf (end) = 77', где я пытаюсь ссылаться так, что 'mlf (2^31 + 1) = 77', но то, что он делает, на самом деле' mlf (1) = 77' - как мне с этим бороться? Я хочу, чтобы размер mlf был одинаковым. Если размер изменится, результат «end» в особенности ... – hhh

0

Rody Oldenhuis рекомендовал whos

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf=mlf(mlf>0) 

mlf = 

    (1,1)  1 


>> whos mlf 
    Name  Size   Bytes Class  Attributes 

    mlf  1x1    32 double sparse  

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf 

mlf = 

        (1,1)      1 

>> whos mlf 
    Name    Size   Bytes Class  Attributes 

    mlf  2147483649x1    32 double sparse  

который показывает ключевую проблему: размер структур изменились. chappjc предоставил возможность решить эту проблему, введя новые переменные.

+1

Когда вы делаете ' MLF = разреженный ([], [], [], 2^31 + 1,1); MLF (1) = 1; MLF = MLF (MLF> 0); whos ans', переменная 'ans' не принадлежит ни к одной из этих команд, потому что все они являются назначениями, а не голыми выражениями. В этом случае, кто знает, что было последним присвоено 'ans'. – chappjc

+0

@chappjc спасибо, исправно! +1 – hhh

+0

Вместо этого ответьте на мой ответ. ;) Использование 'size' достаточно, чтобы показать проблему без переназначения' mlf', как в вашей новой первой команде, но 'whos' также демонстрирует причину. – chappjc

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