Например, если я хочу прочитать среднее значение из magic(5)
, я могу сделать это так:
M = magic(5);
value = M(3,3);
чтобы получить value == 13
. Я хотел бы иметь возможность сделать что-то вроде этого:
value = magic(5)(3,3);
value = (magic(5))(3,3);
обойтись без промежуточной переменной. Тем не менее, MATLAB жалуется Unbalanced or unexpected parenthesis or bracket
на первую скобку перед 3
.
Можно ли считать значения из массива / матрицы без предварительного присвоения переменной?
matlab
indexing
matrix
return-value
variable-assignment
Джо Кирни
источник
источник
testmatrix('magi', 5)(3, 3)
на Scilab иmagic(5)(3, 3)
на октаве работе , так как шарм!Ответы:
Это на самом деле это можно делать то , что вы хотите, но вы должны использовать функциональную форму оператора индексирования. Когда вы выполняете операцию индексирования с использованием
()
, вы фактически вызываетеsubsref
функцию. Итак, даже если вы не можете сделать это:Вы можете сделать это:
Уродливо, но возможно. ;)
В общем, вам просто нужно изменить шаг индексации на вызов функции, чтобы у вас не было двух наборов скобок, следующих сразу за друг другом. Другой способ сделать это - определить собственную анонимную функцию для индексирования по подписке. Например:
Однако, когда все сказано и сделано, решение для временных локальных переменных становится намного более читабельным, и определенно то, что я бы предложил.
источник
clear
на временное (который никто никогда не делает) - временный , как правило , держаться дольшеПару дней назад была просто хорошая запись в блоге о Лорен о искусстве Matlab с парой драгоценных камней, которые могли бы помочь. В частности, используя вспомогательные функции, такие как:
где
paren()
можно использовать каквернется
Я также предположил бы, что это будет быстрее, чем ответ gnovice, но я не проверял (Используйте профилировщик !!!). Тем не менее, вы также должны включить эти определения функций где-то. Я лично сделал их независимыми функциями на моем пути, потому что они очень полезны.
Эти и другие функции теперь доступны в дополнении « Functional Programming Constructs», которое доступно через обозреватель дополнений MATLAB или в File Exchange .
источник
myfunc().attr
?myfunc()
возвращает структуру, которая включает в себя атрибутattr
, то для доступа вattr
данный момент мне нужно сделатьS = myfunc(); S.attr
. Вопрос в том, можем ли мы иметь вспомогательную функцию, какgetattr(myfunc(), 'attr')
в аналогии сparen
иcurly
помощниками. Я не понимаю, как это связано с набором инструментов базы данных.Как вы относитесь к использованию недокументированных функций:
или для клеточных массивов:
Прямо как волшебство :)
ОБНОВИТЬ:
Плохая новость, вышеупомянутый взлом больше не работает в R2015b ! Это нормально, это была недокументированная функциональность, и мы не можем полагаться на нее как на поддерживаемую функцию :)
Для тех, кто интересуется, где найти этот тип вещей, посмотрите в папку
fullfile(matlabroot,'bin','registry')
. Там есть куча файлов XML, в которых перечислены все виды вкусностей. Имейте в виду, что прямой вызов некоторых из этих функций может легко привести к сбою сеанса MATLAB.источник
':'
чтобы избежать ошибкиUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(в некоторых местах он работает без кавычек напрямую,:
в отличие от':'
, например, при запуске в командной строке напрямую, а не внутри функции. Я думаю, это ошибка в синтаксическом анализаторе!)end
это?end
трюк не работает в этом синтаксисе, вы должны быть явно указаны при индексации. (То же самое ограничение применяется для большинства других перечисленных ответов)По крайней мере, в MATLAB 2013a вы можете использовать
getfield
как:чтобы получить элемент в (1,2)
источник
к сожалению, синтаксис вроде
magic(5)(3,3)
не поддерживается Matlab. вам нужно использовать временные промежуточные переменные. Вы можете освободить память после использования, напримеристочник
Обратите внимание, что если вы сравните время выполнения со стандартным способом (присвойте результат и затем получите доступ к записям), они будут точно такими же.
На мой взгляд, суть в том, что в MATLAB нет указателей, с этим нужно жить.
источник
Это может быть проще, если вы сделаете новую функцию:
и затем используйте это:
источник
subref
делает ... но в более общем смысле.Ваша начальная запись является наиболее кратким способом сделать это:
Если вы делаете это в цикле, вы можете просто каждый раз переназначать M и игнорировать оператор clear.
источник
Чтобы дополнить ответ Амро, вы можете использовать
feval
вместоbuiltin
. На самом деле нет никакой разницы, если только вы не попытаетесь перегрузить функцию оператора:Интересно то, что это
feval
кажется чуть-чуть быстрееbuiltin
(на ~ 3,5%), по крайней мере, в Matlab 2013b, что странно, учитывая, чтоfeval
нужно проверить, не перегружена ли функция, в отличие отbuiltin
:источник
feval
делает «нормальную» вещь и, следовательно, может в полной мере использовать этот список.builtin
нужно искать в другом месте, чтобы он нашел только встроенные функции. Вероятно, этот случай не оптимизирован почти так же хорошо, как «нормальный» случай, потому что зачем вкладывать деньги в оптимизацию чего-то, что используется не очень часто?