MATLAB - построение матрицы из вывода системных команд в цикле for - PullRequest
0 голосов
/ 07 февраля 2012

Я был бы очень признателен за помощь в этом.

Я пытаюсь сделать следующее.

В цикле for запустите 2 системные команды и получите выходные данные этих двух команддо всех трех элементов одной строки матрицы для каждой итерации цикла.Затем я хотел бы распечатать всю матрицу в файл Excel.

Я попытался это сделать:

for i=1:3,
    command1 = ['fslmeants -i image1 -m example_' num2str(i) '.nii.gz' ]
    C(i,1) = evalc('system([command1])')
    command2 = ['fslstats example_' num2str(i) ' -V']
    C(i,2:3) = evalc('system ([command2])')
end

Я получил следующее сообщение об ошибке:

???Назначение имеет больше не-одноэлементных rhs-измерений, чем не-одноэлементных подписок* Затем я попробовал

for i=1:3,
    command1 = ['fslmeants -i image1 -m example_' num2str(i) '.nii.gz' ]
    A = evalc('system([command1])')
    command2 = ['fslstats example_' num2str(i) ' -V']
    B = evalc('system ([command2)')
end

вывод для системы ([command1]), когда я не пытаюсь присвоить ему элемент матрицы, это

A =

 0.302714

ans =

 0

вывод для системы([command2]), когда я не пытаюсь присвоить ей матричные элементы, это

B =

 1413 19506.814453

ans =

 0

Если я тогда наберу B (1,2), я получу

ans =

 4

, что даетмне вторая цифра первого числа в B, а не второе число (19506.814453), как я хотел.

Затем я проверил, был ли B массивом символов следующим образом:

ischar B

ans =

   1

ИтакЯ полагаю, что если я смогу найти способ для matlab распознавать выходные данные system ([command1]) и system ([command2]) как 3 элемента одной строки для каждой итерации цикла for, который я бы отсортировал.

Так что в идеале первая строка Матрицы C должна быть

C(1,:) = [ 0.302714 1413 19506.814453 ]

, и при каждой итерации цикла for будет добавлена ​​дополнительная строка.

Может кто-нибудьпросветить потерянную душу?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

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

[~,output]=system('....');

Чтобы преобразовать строку в число или матрицу, используйте функцию str2num.

str2num('123')
ans =
   123

str2num('1 2 3')
ans =
     [ 1     2     3 ]
0 голосов
/ 07 февраля 2012

Почему бы вам просто не собрать вывод вызова system без использования evalc?

[status, A] = system(command1);
[status, B] = system(command2);

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

Bnum = str2double(regexp(B,' ','split'));

Вы можете сделать то же самое для A (если command1 может вернуть несколько чисел) или просто преобразовать строку в число:

Anum = str2double(A);

Затем вы объединяете их в один вектор:

C(1,:) = [A, B];

Убедитесь, что обе команды всегда возвращают одинаковое количество значений.

...