Матричная цепочка в MATLAB

У меня есть этот код в Mathematica:

nxBin = Table[{-5 sX + (i - 0.5)*step, nBin[[i]]}, {i, 1, Length[nBin]}]

и я сделал это в MATLAB:

a=zeros(length(nBin),1);
nxBin=zeros(length(nBin),1);
for i=1:length(nBin)
    anew=a*step*(i-0.5) -5*sX;
    b=zeros(length(nBin(i)),1);
nxBin(i,:)=[anew , b]
end

но MATLAB говорит

??? Ошибка при использовании ==> horzcat
Размеры аргументов CAT не согласованы.

Ошибка в ==> начинается с 52
nxBin(i,:)=[anew , b]

Может ли кто-нибудь сказать мне, почему я получаю эту ошибку? Кроме того, могу ли я сделать это с меньшим количеством строк?


person George    schedule 13.02.2011    source источник


Ответы (1)


Вы хотите связать массив nBin n на 1 с шагами (возможно, значениями x для гистограммы). Таким образом, вы можете просто создать «х-вектор» и объединить их.

nxBin = [ -5*sX + ((1:length(nBin))' - 0.5) * nStep, nBin(:)]

Вот то же самое пошагово

%# make a vector with values from 1 to nBin
x = 1:length(nBin);
%# transpose, since it's 1-by-n and we want n-by-1
x = x'; %'#
%# apply the modification to x
x = -5*sX + (x-0.5)*nStep;
%# catenate with nBin (the colon operator guarantees it's n-by-1
nxBin = [x, nBin(:)];

ИЗМЕНИТЬ

Если вы хотите построить это, вы можете сделать

plot(nxBin(:,1),nxBin(:,2),'.')

или, если я правильно угадаю, и это гистограмма

bar(nxBin(:,1),nxBin(:,2))
person Jonas    schedule 13.02.2011
comment
Йонас, спасибо еще раз. Ваши примеры очень полезны для меня. Я хотел спросить 2 вещи: 1) я не могу понять, как работает итерация во втором столбце (nBin (:)). (я понимаю первый столбец). 2) Есть ли какая-нибудь книга или где-нибудь, где можно научиться манипулировать матрицами таким образом? (я изучаю как можно больше по математике, но это больше похоже на справочник, и это не очень полезно для меня. Если вы можете отправить мне пишите с вашими предложениями буду благодарен) - person George; 13.02.2011
comment
@George: в nBin(:) нет итерации, он просто преобразует nBin в массив n-by-1. Если вы знаете, что nBin уже является правильной формой, вы можете опустить ее, если вы знаете, что это неправильная форма, вы, конечно, можете ее транспонировать, но если вы этого не сделаете, вы используете двоеточие-изменение формы на всякий случай. - person Jonas; 13.02.2011
comment
@George: Вы работали с разделом начало работы, включая демонстрации и ролики? - person Jonas; 13.02.2011
comment
Я имел в виду, как 1:length(nBin) проходит каждый раз, когда nBin, таким образом, наш второй столбец. И да, я прочитал раздел «Начало работы», но в этих ситуациях мне нужно что-то более подробное и с примерами. Еще раз спасибо - person George; 13.02.2011
comment
@George: К сожалению, я заметил, что забыл вставить 1:length(nBin) в длинное объяснение! Я так привык, что префикс n- указывает на то, что переменная содержит number of, что я забыл, что в вашем случае это вектор. Надеюсь это поможет. - person Jonas; 13.02.2011
comment
Я пытаюсь... :-).. Джонас, если я хочу построить ListPlot[nxBin] и Plot[kmPN[x, mX, sX]*step, {x, -5 sX, 5 sX} ] и попробуйте это fg1=plot(nxBin,'b.') fg2=plot(kmg*step,[-5*sX,5*sX]) Я беру на первом графике правильный график, но с неправильной осью X (и это дает мне линию по оси X, которую я не хочу (где g = @ (x) pn (x, mX, sX)); Как я могу это сделать? - person George; 13.02.2011
comment
Если вас это утешит: мне трудно понять программирование Mathematica, так как оно сильно отличается от языков на основе C. - person Jonas; 13.02.2011
comment
Хорошо, это работает. Это не гистограмма (у меня есть предыдущие гистограммы). Но на графике [км * PN [x, mX, sX] * шаг, {x, -5 sX, 5 sX}] у меня есть проблема. Я создал файл функции, который включает функцию PN = pn(x,m,s), и я не могу понять, как ею манипулировать. См. мой предыдущий комментарий. - person George; 13.02.2011
comment
@ Джордж: О, понятно. Вы можете сначала определить свой x как x=-5*sX:5*sX;, а затем вызвать plot с plot(x,pn(x,mX,sX)*step) - person Jonas; 13.02.2011
comment
@George: Вы видели x (дважды щелкнув по нему в браузере рабочей области)? Он пуст? Если да, то это потому, что 5 * sX меньше 0,5, а размер шага по умолчанию равен 1. В этом случае вам нужно настроить размер шага, написав что-то вроде x=-5*sX:0.1:5*sX для размера шага 0,1 или x=linspace(-5*sX,5*sX,100) для 100 линейных интервалов. точки. - person Jonas; 13.02.2011
comment
Да, вы правы! Там было пусто. Я использовал 1000 баллов и теперь все в порядке! Еще раз большое спасибо.. - person George; 13.02.2011
comment
@George: Re: изучение Matlab, эта книга может представлять для вас интерес. - person Jonas; 18.02.2011