MATLAB: переписать код в алгебраических терминах
тут поможет функция meshgrid
N = length(x); M = length(y);
up = zeros(N,M); um = up;
for m=1:M
up(:,m) = x(:) + y(m);
um(:,m) = x(:) - y(m);
end
Так работает?
up = zeros(N,M); um = up;
for m=1:M
up(:,m) = x(:) + y(m);
um(:,m) = x(:) - y(m);
end
Так работает?
а от второго цикла как избавиться?;-)
а от второго цикла как избавиться?;-)просто через оператор : у меня никогда не удавалось избавиться от второго цикла... Однако 5 лет назад был случай, когда удалось одному парню сделать это... но больше у него этот результат не повторялся..
В качестве шутки:
в случае с суммой можно взять логарифмы, перемножить матрицы и взять (поэлементную) экспоненту
На разность тоже адаптируется
в случае с суммой можно взять логарифмы, перемножить матрицы и взять (поэлементную) экспоненту

На разность тоже адаптируется

Типа up = log( exp( x ) * exp( y' ) );
Типа um = log( exp( x ) * exp( -y' ) );
это если size( x ) = [ N 1 ], size( y ) = [ M 1 ]
Возможно, у log основание другое, надо проверить.
Типа um = log( exp( x ) * exp( -y' ) );
это если size( x ) = [ N 1 ], size( y ) = [ M 1 ]
Возможно, у log основание другое, надо проверить.
В качестве шутки:Напиши, плз, код этого дела...
в случае с суммой можно взять логарифмы, перемножить матрицы и взять (поэлементную) экспоненту
На разность тоже адаптируется
Перепутал, экспоненту и логарифм местами надо поменять. В посте исправлено.
что-то типа должно сработать:
X = repmat(x(1.M);
Y = transpose(repmat(y(1,N;
up = X+Y;
um = X-Y;
transpose если не комплексные можно заменить на '
X = repmat(x(1.M);
Y = transpose(repmat(y(1,N;
up = X+Y;
um = X-Y;
transpose если не комплексные можно заменить на '
Типа up = log( exp( x ) * exp( y' ) );работает!
Типа um = log( exp( x ) * exp( -y' ) );
это если size( x ) = [ N 1 ], size( y ) = [ M 1 ]
Возможно, у log основание другое, надо проверить.
ох не устойчивые у тебя шутки 

никто не спорит 

Кстати, нет матлаба под рукой, но что-то мне кажется, что тут кошерно заюзать bsxfun, не помню, правда, развернет ли он так, как надо, но практически уверен.
что-то типа должно сработать:Тоже работатет
X = repmat(x(1.M);
Y = transpose(repmat(y(1,N;
up = X+Y;
um = X-Y;
transpose если не комплексные можно заменить на '
А, я понял, это намек. Попробуй, пожалуйста
up = bsxfun( @plus, x, y' );
up = bsxfun( @plus, x, y' );
Вопрос отцам матлаба...
Есть функция find которой можно искать число (например 1 )в массиве. типа [u,v] = find(A==1);
А как устроить тоже самое, но просматривать надо значение филдов у structure.
типа
s(1).a =1;
s(2).a=2;
....
Как без цикла записать в стиле find(s.a ==1)...... а то такая команда не работатет
Есть функция find которой можно искать число (например 1 )в массиве. типа [u,v] = find(A==1);
А как устроить тоже самое, но просматривать надо значение филдов у structure.
типа
s(1).a =1;
s(2).a=2;
....
Как без цикла записать в стиле find(s.a ==1)...... а то такая команда не работатет
Может быть, что-то типа reshape(x,length(x1)*ones(1,length(y)+ones(length(x1)*reshape(y,1,length(y?
ты думаешь, умножение на ones будет лучше, чем repmat?
Я, кстати, не удивлюсь, если в этом гавене через repmat быстрее работает, чем через bsxfun.
Я, кстати, не удивлюсь, если в этом гавене через repmat быстрее работает, чем через bsxfun.
А, я понял, это намек. Попробуй, пожалуйстаup = bsxfun( @plus, x, y' ); - работат!
up = bsxfun( @plus, x, y' );
um = bsxfun( @minus, x', y ); работает только вот так вот надо видоизменить..
reshape(x,length(x1)*ones(1,length(y)+ones(length(x1)*reshape(y,1,length(yчем это репмата отличается? ну кроме более высокой цены?
ПС reshape(x,length(x1) == x(:)
В общем, bsxfun — это правильное решение.
Я, кстати, не удивлюсь, если в этом гавене через repmat быстрее работает, чем через bsxfun.вполне возможно. Зато читается легче. У меня голова кругом идет после решейпов и репматов одних за другим.
Кстати, долго ломал голову как сделать без циклов. Не допер:
как преобразовать [X_1 X_2 .. X_n] в [X_1; X_2; .. X_n]
X_i квадратные блоки заданной величины.
Это круто!
Но кто подскажет про find в филдах ?
Но кто подскажет про find в филдах ?

Спасибо зачитался
Честно говоря тоже сразу не приходит в голову, но здесь работает отмазка: число итераций цикла значительно меньше числа действий для выполнения этого преобразования, поэтому можно циклом 
Да даже скорее так и надо, если нету стандартной функции для этого дела.

Да даже скорее так и надо, если нету стандартной функции для этого дела.
ПС reshape(x,length(x1) == x(:)Мне нужен именно столбец был. А так ничем, задача-то ставилась без циклов написать. Или тут быстродействие было прописано в условиях задачи?

transpose если не комплексные можно заменить на 'есть ".'"
как преобразовать [X_1 X_2 .. X_n] в [X_1; X_2; .. X_n]Такое ощущение, что здесь собрание неудачников, которые книжку не смогли прочитать по матлабу
X_i квадратные блоки заданной величины.
Если что, то я про себя тоже

вообще логично
итераций мало я подумал слекга и забил. Все равно не так много времени берет. Учитывая, что потом квадратичная программа вычисляется с этими матрицами то не особо критично 
итераций мало я подумал слекга и забил. Все равно не так много времени берет. Учитывая, что потом квадратичная программа вычисляется с этими матрицами то не особо критично 
Мне нужен именно столбец был.ну дык x(:) и дает столбец! .... или строку...

А так ничем, задача-то ставилась без циклов написать. Или тут быстродействие было прописано в условиях задачи?математик![]()

x(:) — столбец.
А что, x(:).' не работает?
А что, x(:).' не работает?
А что, x(:).' не работает?да черт знает, надо шуми спросить
не пробовалКак без цикла записать в стиле find(s.a ==1)
find([s.a]==1)
нет?
да, кстати, comma-separated list можно загнать в array, ты должно быть прав.
Спасибо!
Решение с meshgrid наиболее универсальное, только плохо работает с M=1.
Решение с meshgrid наиболее универсальное, только плохо работает с M=1.
не-не, юзай bsxfun, оно наиболее универсальное, что с ним не так?
математикСлужу Советскому Союзу!
А так предпочитаю прозрачность и краткость кода быстродействию. С современными компами можно особо не париться над производительностью

А так предпочитаю прозрачность и краткость кода быстродействию. С современными компами можно особо не париться над производительностьюбрехня. Ты б ещё суперкомьютеры как довод приводил. Чипы в самолетах или машинах в бортовых компьютерах слабее чем айпод. У меня программы неделями гоняются, и при этом они уже оптимизированы. Тут конечно ещё матлаб играет роль, но оптимизировать код очень полезно.
брехня. Ты б ещё суперкомьютеры как довод приводил. Чипы в самолетах или машинах в бортовых компьютерах слабее чем айпод. У меня программы неделями гоняются, и при этом они уже оптимизированы. Тут конечно ещё матлаб играет роль, но оптимизировать код очень полезно.Ну, ты лучше знаешь, что тебе нужно

У меня скрипты на матлабе максимум полчаса выполнялись.
А что, в самолетах или в бортовых компах работают программы на матлабе?

нет, ты прав
Но это просто пример к оптимизации.
К тому же сейчас тренд идет на увеличение количества процессоров в пк и тут векторная арифметика очень полезна. Циклы могут заметно замедлить программу. Вообще от применения зависит, конечно же. Тебе может и нужно, другим очень нужно. Так что спорить не вижу смысла. Вполне допускаю, что многим быстродействие не особо интересно. Мне в частности нужно, у меня размерности матриц на близки к десяткам тысяч.
Но это просто пример к оптимизации.К тому же сейчас тренд идет на увеличение количества процессоров в пк и тут векторная арифметика очень полезна. Циклы могут заметно замедлить программу. Вообще от применения зависит, конечно же. Тебе может и нужно, другим очень нужно. Так что спорить не вижу смысла. Вполне допускаю, что многим быстродействие не особо интересно. Мне в частности нужно, у меня размерности матриц на близки к десяткам тысяч.
пиши на фортране если тебе критично быстродействие 

repmat более читаем, чем умножение на ones, bsxfun более читаем, чем repmat.
к матлабу очень много всяких тулбоксов и полностью переписывать тулбоксы нет ни малейшего желания 

для FORTRANа "тулбоксов" как минимум не меньше:)
Это для данного примера более читаемо bsxfun, а если надо не прибавить/вычесть, а записать формулу посложнее (например, плотность двумерного нормального распределния)?
ПО тестам производительности и наглядности кода пока что выигрывает meshgrid. Ещё раз спасибо!
ПО тестам производительности и наглядности кода пока что выигрывает meshgrid. Ещё раз спасибо!
Это для данного примера более читаемо bsxfun, а если надо не прибавить/вычесть, а записать формулу посложнее (например, плотность двумерного нормального распределния)?up = bsxfun( @(x,y) <тут любая формула>, x, y' ) ?
но ведь не в количестве дело
нее, согласен, что если уж совсем туго, то надо переписывать. Хотя бы тяжелые части. Ну хотя бы в си++ и включать в матлаб. Хотя порою и это не помогает.
нее, согласен, что если уж совсем туго, то надо переписывать. Хотя бы тяжелые части. Ну хотя бы в си++ и включать в матлаб. Хотя порою и это не помогает.не, матлаб для разработок промышленного кода вообще не подходит, имхо. Он помогает прикинуть алгоритм и т.д.
По крайней мере сейчас он слишком сырой, оптимизирует код ужасно, с такой-то информацией.
По крайней мере сейчас он слишком сырой, оптимизирует код ужасно, с такой-то информацией.
для FORTRANа "тулбоксов" как минимум не меньше:)На С больше, поэтому часто приходится самому лабать.
В матлабе удобно мне кажется решать только диффуры, то-есть интегрировать разные системы, моделировать системы управления, в механике той же очень удобно задавать системы уравнений Эйлера сразу в векторном виде и так далее. Для перемножения матриц как-то нерентабельно в системах реального времени его гонять.
fortran и C хорошо совмещаются
fortran и C хорошо совмещаютсяНу вот люди, которые занимаются реальными квантомеханическими расчетами, говорят, что библиотек для фортрана меньше, дело касается распараллеливания.
Как без цикла записать в стиле find(s.a ==1)Работает! Круто! Спасибо!
code: find([s.a]==1)
нет?
to all.
Не понял про x(:).' - это про что?
Не понял про x(:).' - это про что?Это более короткий аналог reshape(x,1,length(x
Это более короткий аналог reshape(x,1,length(xесли x-столбец?
если х — что угодно, не обязательно столбец.
Если известно, что х — столбец, то можно просто х.'
А если известно, что строка, то можно просто x
Если известно, что х — столбец, то можно просто х.'
А если известно, что строка, то можно просто x
если х — что угодно, не обязательно столбец.Забавно, не знал, что двоеточие всегда обрабатывается как строка
Если известно, что х — столбец, то можно просто х.'
А если известно, что строка, то можно просто x

Просто часто в матрицах использовал диапазоны, а там где строка, а где и столбец.
Забавно, не знал, что двоеточие всегда обрабатывается как строкакак столбец.
Вообще, если индекс один, то он по внутреннему представлению: там все матрицы вытянуты в порядке размерностей. Для двумерной матрицы это все столбцы по порядку, для трехмерной — все слои, каждый слой — как двумерная матрица и т.д.
ля двумерной матрицы это все столбцы по порядкуЭто-то я хорошо усвоил, что в памяти массивы упорядочены по столбцам --- сначала первый столбец (когда первый индекс меняется) записывается, потом второй после него (когда изменился на единицу второй индекс, и опять пошел первый индекс меняться) и т/д. Про одномерный массив вроде в этом свете стало понятно.
Для быстрого получения (в том числе и не программистами) результатов MATLAB - то, что нужно. Кроме того, MATLAB можно успешно использовать только для графичечкого вывода.
MATLAB можно успешно использовать только для графичечкого вывода.тут не понял немного. Почему только для графического?
Все ресурсоёмкие вычисления производить на C, а для графики/видео использовать MATLAB.
ну тогда можно и гнуплот или еще чего использовать.
Я матлаб рассматриваю исключительно как коллекцию реализованных алгоритмов, где можно затестить применение этих самых алгоритмов. А потом уже писать на C/C++, да.
Я матлаб рассматриваю исключительно как коллекцию реализованных алгоритмов, где можно затестить применение этих самых алгоритмов. А потом уже писать на C/C++, да.
А потом уже писать на C/C++, да.Что, и Рунге-Кутта будешь переписывать на С/С++/Fortran?

А он еще не написан?
Тем более нашел алгоритм, он же отстойный.
Тем более нашел алгоритм, он же отстойный.
А он еще не написан?Ну, ты ж пишешь, что сам будешь его переписывать
В матлабе откуда ты знаешь, как реализован алгоритм, и совпадает ли он на самом деле с реализованным в библиотеке.
Тем более нашел алгоритм, он же отстойный.А какой ты считаешь не отстойным?
А чего, большая проблема Рунге-Кутта написать? 

А какой ты считаешь не отстойным?ладно, я имел в виду стандартный рунге-кутта второго порядка, он простой и беспонтовый.
Ну, ты ж пишешь, что сам будешь его переписыватьне писал я такого.
А чего, большая проблема Рунге-Кутта написать?Проблема не в том, чтобы написать, а в том, чтобы не заниматься лишней деятельностью
Если на такие мелкие подзадачки отвлекаться постоянно, то на основную не останется сил.
Твой вопрос хорош, если Рунге-Кутта изучать как самоцель, в книжках копаться, разбираться, вспоминать.
Я предпочитаю воспользоваться готовым матлабовским.

ладно, я имел в виду стандартный рунге-кутта второго порядка, он простой и беспонтовый.Мне в матлабе хватает даже 4-5-ого порядка (ode45 что ли называется).
не писал я такого."А потом уже писать на C/C++, да." --- Я это понял так.

Что значит "даже"? 

Неправильно понял. Повторное использование кода никто не отменял.
Что значит "даже"?Там вроде еще есть 6-7-ого порядка. Еще какие-то специальные для жестких систем, но это уже для специальных задач.
А, понял.
Ну так и как ты предлагаешь писать код, который должен работать в реальном времени, я так и не понял.
Ну так и как ты предлагаешь писать код, который должен работать в реальном времени, я так и не понял.
Ну так и как ты предлагаешь писать код, который должен работать в реальном времени, я так и не понял.Мы уже от реального времени отошли вроде в обсуждении.
А в реальном времени используют максимум ломаные Эйлера, какие тебе там высокие порядки!
Там ошибки данных такие, что гладкие методы просто убьются насмерть 
Реальное время реальному времени рознь. И не только ведь в диффурах дело 
Не, ну т.е. ты предлагаешь на матлабе писать, я правильно понял?
Ну там, обработку изображений, распознавание.

Не, ну т.е. ты предлагаешь на матлабе писать, я правильно понял?
Ну там, обработку изображений, распознавание.
Не, ну т.е. ты предлагаешь на матлабе писать, я правильно понял?Да, спокойно использовать в моделировании. Как показывает опыт (да, признаюсь, мой опыт
Ну там, обработку изображений, распознавание.
ошибки гуляют в мозгах авторов моделей, но никак не в алгоритмах. Если хочется проверить правильность вычислений при отлаженном алгоритме, то попробовать другим методом, с большими точностями.можно так. Приблизить дифур (или интегро-дифференциальное ур-ие) системой линейных уравнений, а она уже реализуется на уровне железа. Даже считать ничего не надо 

да не в правильности дело, а в тормознутости и тяжелости.
По теме: так думается, что в таких популярных пакетах типа матлаба все ошибки уже исправлены.ode45 не всегда приятен в использовании, например если неизвестная функция мыслится не как вектор, а как матрица.
ode45 не всегда приятен в использовании, например если неизвестная функция мыслится не как вектор, а как матрица.там оберточка на это дело пишется в 6 строк. Могу подкинуть

Подкинь 

function Q = matrixOde45(A, tspan, X0, options)
N = size( X0, 1 );
[t,Q] = ode45( @(t,y) matrixPull( A, t, y, N tspan, X0( options );
Q = reshape( Q, length( tspan N, N );
end
function X = matrixPull(A, t, y, N)
X = A( t, reshape( y, N, N ) );
X = X(:);
end
A —
Например, A = @(t,X) [ t 0; 0 t ] * X.
reshape в конце сделан, чтобы была группировка по времени (элементы с близким временем расположены близко в памяти что логично и в той задаче, для которой была написана эта функция, было удобно.
Фишка в том, что reshape при вычислении matrixPull вообще должен оптимизироваться в ничто. Но это же, блин, матлааааб.
Спасибо 
* Задумался, откуда у меня взялась аллергия на такие обертки.

* Задумался, откуда у меня взялась аллергия на такие обертки.
* Задумался, откуда у меня взялась аллергия на такие обертки.доложи о результатах, интересно.

stream_24
Подскажите, п-та, можно ли переписать следующий участок кода без цикловСпасибо!