Что Ваш любимый MATLAB/октава программирует прием? [закрытый]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

73
задан 9 revs, 4 users 57% 28 April 2011 в 15:36
поделиться

26 ответов

Используя встроенного профилировщика для наблюдения, где горячие части моего кода:

profile on
% some lines of code
profile off
profile viewer

или просто использование созданного в tic и toc для получения быстрых синхронизаций:

tic;
% some lines of code
toc;
39
ответ дан 2 revs 24 November 2019 в 12:05
поделиться

Векторизация:

function iNeedle = findClosest(hay,needle)
%FINDCLOSEST find the indicies of the closest elements in an array.
% Given two vectors [A,B], findClosest will find the indicies of the values
% in vector A closest to the values in vector B.
[hay iOrgHay] = sort(hay(:)');  %#ok must have row vector

% Use histogram to find indices of elements in hay closest to elements in
% needle. The bins are centered on values in hay, with the edges on the
% midpoint between elements.
[iNeedle iNeedle] = histc(needle,[-inf hay+[diff(hay)/2 inf]]); %#ok

% Reversing the sorting.
iNeedle = iOrgHay(iNeedle);
3
ответ дан 2 revs, 2 users 72% 24 November 2019 в 12:05
поделиться

Контурные графики с [c,h]=contour и clabel(c,h,'fontsize',fontsize). Я обычно использую fontsize параметр для сокращения размера шрифта, таким образом, числа не сталкиваются друг с другом. Здорово для просмотра значения 2-D функций, не имея необходимость слоняться без дела с 3D графиками.

3
ответ дан Jason S 24 November 2019 в 12:05
поделиться

Выполнение модели Simulink непосредственно из сценария (а не в интерактивном режиме) использование эти sim команда. Можно сделать, вещам нравится, берут параметры от переменной рабочей области, и неоднократно работают sim в цикле для моделирования чего-то при варьировании параметра, чтобы видеть, как поведение изменяется, и изобразите результаты в виде графика с любыми графическими командами, которые Вы любите. Намного легче, чем попытка сделать это в интерактивном режиме, и это дает Вам намного больше гибкости, чем блоки "осциллографа" Simulink при визуализации результатов. (хотя Вы не можете использовать его для наблюдения то, что продолжается в в реальном времени, в то время как моделирование работает)

А, действительно важная вещь знать DstWorkspace и SrcWorkspace опции simset команда. Они управляют, где "К Рабочей области" и "От Рабочей области" блоки получают и помещают свои результаты. Dstworkspace значения по умолчанию к текущей рабочей области (например, если Вы звоните sim из функции "К Рабочей области" блоки, обнаружится как переменные, доступные из той же самой функции), но SrcWorkspace значения по умолчанию к базовому рабочему пространству и если Вы хотите инкапсулировать свой вызов к sim, Вы захотите установить SrcWorkspace на [1 111], таким образом, будет чистый интерфейс к обеспечивающим/получающим входным параметрам моделирования и выводам. Например:

function Y=run_my_sim(t,input1,params)
% runs "my_sim.mdl" 
% with a From Workspace block referencing I1 as an input signal
% and parameters referenced as fields of the "params" structure
% and output retrieved from a To Workspace block with name O1.
opt = simset('SrcWorkspace','current','DstWorkspace','current');
I1 = struct('time',t,'signals',struct('values',input1,'dimensions',1));
Y = struct;
Y.t = sim('my_sim',t,opt);
Y.output1 = O1.signals.values;
3
ответ дан Jason S 24 November 2019 в 12:05
поделиться

Используя ismember () для слияния данных, организованных текстом identfiers. Полезный, когда Вы анализируете отличающиеся периоды, когда записи, в моих символах компании случая, приходят и уходят.

%Merge B into A based on Text identifiers
UniverseA = {'A','B','C','D'};
UniverseB = {'A','C','D'};

DataA = [20 40 60 80];
DataB = [30 50 70];

MergeData = NaN(length(UniverseA),2);

MergeData(:,1) = DataA;

[tf, loc] = ismember(UniverseA, UniverseB);

MergeData(tf,2) = DataB(loc(tf));

 MergeData =

20    30
40   NaN
60    50
80    70
4
ответ дан Robert Van Hoose 24 November 2019 в 12:05
поделиться

Оператор двоеточия для управления массивами.

@ScottieT812, упоминает тот: выравнивание массива, но существуют все другие варианты выбора битов массива:


x=rand(10,10);
flattened=x(:);
Acolumn=x(:,10);
Arow=x(10,:);

y=rand(100);
firstSix=y(1:6);
lastSix=y(end-5:end);
alternate=y(1:2:end);
5
ответ дан 3 revs 24 November 2019 в 12:05
поделиться

Знайте Ваш свойства оси ! Существуют все виды вещей, которые можно установить для тонкой настройки свойств графического изображения значения по умолчанию, чтобы сделать то, что Вы хотите:

set(gca,'fontsize',8,'linestyleorder','-','linewidth',0.3,'xtick',1:2:9);

(как пример, устанавливает fontsize на 8 ПБ, стили линии всех новых строк ко всем быть твердым и их ширина 0.3 ПБ, и xtick указывает, чтобы быть [1 3 5 7 9])

Строка и , свойства рисунка также полезны, но я использую свойства оси больше всего.

5
ответ дан Jason S 24 November 2019 в 12:05
поделиться

условные аргументы в левой стороне присвоения:

t = (0:0.005:10)';
x = sin(2*pi*t);
x(x>0.5 & t<5) = 0.5;
% This limits all values of x to a maximum of 0.5, where t<5
plot(t,x);
5
ответ дан Jason S 24 November 2019 в 12:05
поделиться

режим LaTeX для формул в графиках : В одном из недавних выпусков (R2006?) Вы добавляете дополнительные аргументы ,'Interpreter','latex' в конце вызова функции, и он будет использовать ЛАТЕКСНЫЙ рендеринг. Вот пример:

t=(0:0.001:1);
plot(t,sin(2*pi*[t ; t+0.25]));
xlabel('t'); 
ylabel('$\hat{y}_k=sin 2\pi (t+{k \over 4}) 

Не уверенный, когда они добавили его, но это работает с R2006b в тексте (), заголовок (), xlabel (), ylabel (), zlabel (), и даже легенда () функции. Просто удостоверьтесь синтаксис, который Вы используете, не неоднозначно (так с легендой (), необходимо определить строки как массив ячеек).

,'Interpreter','latex'); legend({'$\hat{y}_0

Не уверенный, когда они добавили его, но это работает с R2006b в тексте (), заголовок (), xlabel (), ylabel (), zlabel (), и даже легенда () функции. Просто удостоверьтесь синтаксис, который Вы используете, не неоднозначно (так с легендой (), необходимо определить строки как массив ячеек).

,'$\hat{y}_1

Не уверенный, когда они добавили его, но это работает с R2006b в тексте (), заголовок (), xlabel (), ylabel (), zlabel (), и даже легенда () функции. Просто удостоверьтесь синтаксис, который Вы используете, не неоднозначно (так с легендой (), необходимо определить строки как массив ячеек).

},'Interpreter','latex');

Не уверенный, когда они добавили его, но это работает с R2006b в тексте (), заголовок (), xlabel (), ylabel (), zlabel (), и даже легенда () функции. Просто удостоверьтесь синтаксис, который Вы используете, не неоднозначно (так с легендой (), необходимо определить строки как массив ячеек).

18
ответ дан 3 revs, 2 users 91% 24 November 2019 в 12:05
поделиться

cellfun и arrayfun для автоматизированного для циклов.

5
ответ дан KennyMorton 24 November 2019 в 12:05
поделиться

Используя nargin для установки значений по умолчанию для дополнительных аргументов и использующий nargout для установки дополнительных выходных аргументов. Быстрый пример

function hLine=myplot(x,y,plotColor,markerType)
% set defaults for optional paramters
if nargin<4, markerType='none'; end
if nargin<3, plotColor='k'; end

hL = plot(x,y,'linetype','-', ...  
              'color',plotColor, ...
              'marker',markerType, ...
              'markerFaceColor',plotColor,'markerEdgeColor',plotColor);

% return handle of plot object if required
if nargout>0, hLine = hL; end
10
ответ дан 2 revs 24 November 2019 в 12:05
поделиться

Вызов Java кодирует от Matlab

10
ответ дан 2 revs, 2 users 67% 24 November 2019 в 12:05
поделиться

Вот набор неочевидных функций, которые время от времени полезны:

  • mfilename (возвращает название в настоящее время под управлением сценария MATLAB)
  • dbstack (предоставляет Вам доступ к именам & номера строки matlab функционируют стек)
  • keyboard (выполнение остановок и управление урожаями к подсказке отладки; это - то, почему существует K в подсказке отладки K>>
  • dbstop error (автоматически помещает Вас в режим отладки, остановленный в строке, которая инициировала ошибку)
11
ответ дан Jason S 24 November 2019 в 12:05
поделиться

Мне нравится использовать указатели на функцию по большому количеству причин. Для одного они - самая близкая вещь, которую я нашел в MATLAB к указателям, таким образом, можно создать подобное ссылке поведение для объектов. Существуют некоторые аккуратные (и более просты) вещи, которые можно сделать с ними, также. Например, замена оператора переключения:

switch number,
  case 1,
    outargs = fcn1(inargs);
  case 2,
    outargs = fcn2(inargs);
  ...
end
%
%can be turned into
%
fcnArray = {@fcn1, @fcn2, ...};
outargs = fcnArray{number}(inargs);

я просто думаю, что небольшие подобные вещи прохладны.

10
ответ дан gnovice 24 November 2019 в 12:05
поделиться

Вот быстрый пример:

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

% Build a list of args, like so:
args = {'a', 1, 'b', 2};
% Then expand this into arguments:
output = func(args{:})
16
ответ дан Matt 24 November 2019 в 12:05
поделиться

О, и реверс массив

v = 1:10;
v_reverse = v(length(v):-1:1);
5
ответ дан Robert Van Hoose 24 November 2019 в 12:05
поделиться

Анонимные функции, по нескольким причинам:

  1. для создания быстрой функции для одноразового использования, как 3x^2+2x+7. (см. упоминание ниже), Это полезно для функций как quad и fminbnd, которые берут функции в качестве аргументов. Это также удобно в сценариях (.m файлы, которые не запускаются с функционального заголовка), с тех пор в отличие от истинных функций, Вы не можете включать подфункции.
  2. для закрытия - хотя анонимные функции немного ограничивают, поскольку, кажется, нет способа иметь присвоение в них для видоизменения состояния.

.

% quick functions
f = @(x) 3*x.^2 + 2*x + 7;
t = (0:0.001:1);
plot(t,f(t),t,f(2*t),t,f(3*t));

% closures (linfunc below is a function that returns a function,
% and the outer functions arguments are held for the lifetime
% of the returned function.
linfunc = @(m,b) @(x) m*x+b;
C2F = linfunc(9/5, 32);
F2C = linfunc(5/9, -32*5/9);
20
ответ дан 3 revs, 2 users 95% 24 November 2019 в 12:05
поделиться

циклы Векторизации . Существует много способов сделать это, и это интересно, чтобы искать циклы в Вашем коде и видеть, как они могут быть векторизованы. Производительность удивительно быстрее с векторными операциями!

22
ответ дан Jason Sundram 24 November 2019 в 12:05
поделиться

Превратите матрицу в вектор с помощью единственного двоеточия.

x = rand(4,4);
x(:)
23
ответ дан Scottie T 24 November 2019 в 12:05
поделиться

Обеспечьте быстрый доступ к другой функциональной документации путем добавления "СМ. ТАКЖЕ" строку к комментариям справки. Во-первых, необходимо включать название функции всеми заглавными буквами как первая строка комментария. Сделайте свой обычный материал заголовка комментария, затем поместите, СМ. ТАКЖЕ со списком разделенных запятой значений других связанных функций.

function y = transmog(x)
%TRANSMOG Transmogrifies a matrix X using reverse orthogonal eigenvectors
%
% Usage:
%   y = transmog(x)
%
% SEE ALSO
% UNTRANSMOG, TRANSMOG2

при вводе "справки transmog" в командной строке Вы будете видеть все комментарии в этом заголовке комментария с гиперссылками к заголовкам комментария для других перечисленных функций.

28
ответ дан Scottie T 24 November 2019 в 12:05
поделиться

Непосредственно извлекая элементы матрицы, которые удовлетворяют конкретное условие, с помощью логических массивов:

x = rand(1,50) .* 100;
xpart = x( x > 20 & x < 35);

Теперь xpart содержит только те элементы x, которые находятся в указанном диапазоне.

31
ответ дан sundar - Reinstate Monica 24 November 2019 в 12:05
поделиться

Хм, почему jQuery слишком большой? Насколько велики ваши страницы?

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

Вы можете вручную удалить код, но это, вероятно, будет огромной головной болью.

в этом случае придется инициализировать x чем-то другим, кроме []. Не подходит для чисел, но для небольших динамических списков вещей (или массивов ячеек), например, для разбора файлов.

Например,

>> x=[1,2,3]
x =  1     2     3
>> x(end+1)=4
x =  1     2     3     4

Еще одна мысль, которую многие люди не знают, заключается в том, что она работает с любым массивом dim 1, поэтому продолжить пример

>> for n = x;disp(n);end
     1
     2
     3
     4

Это означает, что если все, что вам нужно, это члены x, то вам не нужно их индексировать.

Это также работает с массивами ячеек, но это немного раздражает, потому что при обходе их элемент все еще оборачивается в cell:

>> for el = {1,2,3,4};disp(el);end
    [1]
    [2]
    [3]
    [4]

Итак, чтобы добраться до элементов, вы должны их индексировать.

>> for el = {1,2,3,4};disp(el{1});end
     1
     2
     3
     4

Я не могу вспомнить, есть ли лучший способ обойти это.

2
ответ дан 2 revs 24 November 2019 в 12:05
поделиться

При использовании функций агрегирования, таких как min, max, mean, diff, sum, any, all, ...

Например, строка:

reldiff = diff(a) ./ a(1:end-1)

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

>> a=rand(1,7);
>> diff(a) ./ a(1:end-1)

ans =
   -0.5822   -0.9935  224.2015    0.2708   -0.3328    0.0458

>> a=1;
>> diff(a) ./ a(1:end-1)
??? Error using ==> rdivide
Matrix dimensions must agree.

Если вы укажете правильные измерения для своих функций, эта строка вернет пустую 1- Матрица by-0, которая является правильной:

>> diff(a, [], 2) ./ a(1, 1:end-1)

ans =

   Empty matrix: 1-by-0

>> 

То же самое относится к функции min, которая обычно вычисляет минимумы по столбцам в матрице, пока матрица не состоит только из одной строки. - Тогда он вернет минимум по строке, если параметр измерения не укажет иное, и, вероятно, сломает ваше приложение.

Я могу почти гарантировать вам, что, следовательно, установка измерений этих функций агрегирования сэкономит вам довольно много времени для отладки. 1225 По крайней мере, так было бы для меня. :)

5
ответ дан ymihere 24 November 2019 в 12:05
поделиться

Мэтлаб bsxfun , arrayfun , cellfun и structfun довольно интересны и часто сохраняют цикл.

M = rand(1000, 1000);
v = rand(1000,    1);
c = bsxfun(@plus, M, v);

Этот код, например, добавляет вектор-столбец v к каждому столбцу матрицы M.

Хотя в критических частях производительности вашего В приложении вы должны сравнить эти функции с обычным циклом for, потому что часто циклы все еще быстрее.

19
ответ дан 24 November 2019 в 12:05
поделиться

-Вы можете создать ярлык Matlab для файла инициализации с именем startup.m. Здесь я определяю форматирование, точность вывода и параметры графика для моего сеанса Matlab (например, я использую более крупную ось графика / размер шрифта, чтобы файлы .fig были хорошо видны, когда я помещаю их в презентации). сообщение в блоге одного из разработчиков об этом http://blogs.mathworks.com/loren/2009/03/03/whats-in-your-startupm/ .

-Вы можете загрузить весь числовой файл ascii с помощью функции "load". Это не особенно быстро, но быстро выполняет работу по прототипированию (разве это не должно быть девизом Matlab?)

. Как уже упоминалось, оператор двоеточия и векторизация - спасатели. Винтовые петли.

2
ответ дан 24 November 2019 в 12:05
поделиться

Использование xlim и ylim для рисования вертикальных и горизонтальных линий. Примеры:

  1. Проведите горизонтальную линию в точке y = 10:

    line (xlim, [10 10])

  2. Проведите вертикальную линию в точке x = 5:

    line ([5 5], ylim)

17
ответ дан 24 November 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: