我认为每个人都会同意,MATLAB语言并不美观,也不特别一致。但没关系!我们仍然必须使用它来完成任务。
您有哪些使事情变得更容易的技巧?让我们每个回答提供一个技巧,以便人们可以投票支持他们。此外,请尝试用示例说明您的答案。
噢,还有反转一个数组
v = 1:10;
v_reverse = v(length(v):-1:1);
问“为什么”(在凌晨3点将我从Matlab运行失败的调试状态中唤醒非常有用...)
%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
persistent
在运行在线算法时。这可能会加快代码的速度,例如在贝叶斯机器学习中,模型需要迭代地训练新样本。例如,对于计算独立对数似然,我最初从头计算对数似然,并通过将先前计算的对数似然和额外的对数似然相加来更新它。function av = runningAverage(x)
% The number of values entered so far - declared persistent.
persistent n;
% The sum of values entered so far - declared persistent.
persistent sumOfX;
if x == 'reset' % Initialise the persistent variables.
n = 0;
sumOfX = 0;
av = 0;
else % A data value has been added.
n = n + 1;
sumOfX = sumOfX + x;
av = sumOfX / n; % Update the running average.
end
runningAverage('reset')
ans = 0
>> runningAverage(5)
ans = 5
>> runningAverage(10)
ans = 7.5000
>> runningAverage(3)
ans = 6
>> runningAverage('reset')
ans = 0
>> runningAverage(8)
ans = 8
使用[c,h]=contour
和clabel(c,h,'fontsize',fontsize)
绘制轮廓图。通常我会使用fontsize
参数来缩小字体大小,以避免数字相互重叠。这对于查看二维函数的值而不必使用三维图形非常有用。
向量化:
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);
sim
命令直接从脚本(而不是交互式)执行Simulink模型。您可以从工作区变量中获取参数,并在循环中重复运行sim
以模拟某些内容,同时改变参数以查看行为如何改变,并使用任何您喜欢的图形命令绘制结果。比尝试交互式操作要容易得多,并且在可视化结果时,它比Simulink“示波器”块更具灵活性。(虽然您无法在仿真运行时实时查看正在发生的情况)
需要知道的一个非常重要的事情是 simset
命令中的 DstWorkspace
和 SrcWorkspace
选项。它们控制“到工作空间”和“从工作空间”块获取和放置其结果的位置。DstWorkspace
默认为当前工作空间(例如,如果您在函数内部调用sim
,则“到工作空间”的块将显示为从同一函数内部访问的变量) ,但是SrcWorkspace
默认为基本工作区,如果想封装对sim
的调用,则需要将SrcWorkspace
设置为current
,以提供/检索仿真输入参数和输出的干净接口。例如:
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;
x=repmat([1:10],3,1); % 假设x是一个数据数组的示例
l=x>=3; % l是一个逻辑向量(1或0),用于突出显示数组中符合某个条件的元素。
N=sum(sum(l));% N是符合给定条件的元素数量。
祝您编写脚本愉快!
N = sum(I(:));
代替,它适用于任何维度。 - catchmeifyoutrynumel(x>=3)
- tashuhkafind
是一个不好的主意,因为它是多余的并且速度较慢。个人而言,我发现逻辑方法更清晰,因为它也避免了额外的混乱。 - Nzbuu
flipud()
或fliplr()
来实现这一点。但是,结合步骤,它更加有用。例如,v(end:-4:1)
。 - Matt