Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Используя встроенного профилировщика для наблюдения, где горячие части моего кода:
profile on
% some lines of code
profile off
profile viewer
или просто использование созданного в tic
и toc
для получения быстрых синхронизаций:
tic;
% some lines of code
toc;
Векторизация:
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);
Контурные графики с [c,h]=contour
и clabel(c,h,'fontsize',fontsize)
. Я обычно использую fontsize
параметр для сокращения размера шрифта, таким образом, числа не сталкиваются друг с другом. Здорово для просмотра значения 2-D функций, не имея необходимость слоняться без дела с 3D графиками.
Выполнение модели 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;
Используя 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
Оператор двоеточия для управления массивами.
@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);
Знайте Ваш свойства оси ! Существуют все виды вещей, которые можно установить для тонкой настройки свойств графического изображения значения по умолчанию, чтобы сделать то, что Вы хотите:
set(gca,'fontsize',8,'linestyleorder','-','linewidth',0.3,'xtick',1:2:9);
(как пример, устанавливает fontsize на 8 ПБ, стили линии всех новых строк ко всем быть твердым и их ширина 0.3 ПБ, и xtick указывает, чтобы быть [1 3 5 7 9])
Строка и , свойства рисунка также полезны, но я использую свойства оси больше всего.
условные аргументы в левой стороне присвоения:
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);
режим 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 (), и даже легенда () функции. Просто удостоверьтесь синтаксис, который Вы используете, не неоднозначно (так с легендой (), необходимо определить строки как массив ячеек).
cellfun и arrayfun для автоматизированного для циклов.
Используя 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
Вот набор неочевидных функций, которые время от времени полезны:
mfilename
(возвращает название в настоящее время под управлением сценария MATLAB) dbstack
(предоставляет Вам доступ к именам & номера строки matlab функционируют стек) keyboard
(выполнение остановок и управление урожаями к подсказке отладки; это - то, почему существует K в подсказке отладки K>>
dbstop error
(автоматически помещает Вас в режим отладки, остановленный в строке, которая инициировала ошибку) Мне нравится использовать указатели на функцию по большому количеству причин. Для одного они - самая близкая вещь, которую я нашел в 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);
я просто думаю, что небольшие подобные вещи прохладны.
Вот быстрый пример:
я нахожу синтаксис списка разделенных запятой значений довольно полезным для создания вызовов функции:
% Build a list of args, like so:
args = {'a', 1, 'b', 2};
% Then expand this into arguments:
output = func(args{:})
О, и реверс массив
v = 1:10;
v_reverse = v(length(v):-1:1);
Анонимные функции, по нескольким причинам:
quad
и fminbnd
, которые берут функции в качестве аргументов. Это также удобно в сценариях (.m файлы, которые не запускаются с функционального заголовка), с тех пор в отличие от истинных функций, Вы не можете включать подфункции. .
% 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);
циклы Векторизации . Существует много способов сделать это, и это интересно, чтобы искать циклы в Вашем коде и видеть, как они могут быть векторизованы. Производительность удивительно быстрее с векторными операциями!
Превратите матрицу в вектор с помощью единственного двоеточия.
x = rand(4,4);
x(:)
Обеспечьте быстрый доступ к другой функциональной документации путем добавления "СМ. ТАКЖЕ" строку к комментариям справки. Во-первых, необходимо включать название функции всеми заглавными буквами как первая строка комментария. Сделайте свой обычный материал заголовка комментария, затем поместите, СМ. ТАКЖЕ со списком разделенных запятой значений других связанных функций.
function y = transmog(x)
%TRANSMOG Transmogrifies a matrix X using reverse orthogonal eigenvectors
%
% Usage:
% y = transmog(x)
%
% SEE ALSO
% UNTRANSMOG, TRANSMOG2
при вводе "справки transmog" в командной строке Вы будете видеть все комментарии в этом заголовке комментария с гиперссылками к заголовкам комментария для других перечисленных функций.
Непосредственно извлекая элементы матрицы, которые удовлетворяют конкретное условие, с помощью логических массивов:
x = rand(1,50) .* 100;
xpart = x( x > 20 & x < 35);
Теперь xpart содержит только те элементы x, которые находятся в указанном диапазоне.
Хм, почему 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
Я не могу вспомнить, есть ли лучший способ обойти это.
При использовании функций агрегирования, таких как 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 По крайней мере, так было бы для меня. :)
Мэтлаб bsxfun , arrayfun , cellfun и structfun довольно интересны и часто сохраняют цикл.
M = rand(1000, 1000);
v = rand(1000, 1);
c = bsxfun(@plus, M, v);
Этот код, например, добавляет вектор-столбец v к каждому столбцу матрицы M.
Хотя в критических частях производительности вашего В приложении вы должны сравнить эти функции с обычным циклом for, потому что часто циклы все еще быстрее.
-Вы можете создать ярлык Matlab для файла инициализации с именем startup.m. Здесь я определяю форматирование, точность вывода и параметры графика для моего сеанса Matlab (например, я использую более крупную ось графика / размер шрифта, чтобы файлы .fig были хорошо видны, когда я помещаю их в презентации). сообщение в блоге одного из разработчиков об этом http://blogs.mathworks.com/loren/2009/03/03/whats-in-your-startupm/ .
-Вы можете загрузить весь числовой файл ascii с помощью функции "load". Это не особенно быстро, но быстро выполняет работу по прототипированию (разве это не должно быть девизом Matlab?)
. Как уже упоминалось, оператор двоеточия и векторизация - спасатели. Винтовые петли.
Использование xlim и ylim для рисования вертикальных и горизонтальных линий. Примеры:
Проведите горизонтальную линию в точке y = 10:
line (xlim, [10 10])
Проведите вертикальную линию в точке x = 5:
line ([5 5], ylim)