我有一堆来自MS论文的MATLAB代码,现在我想将其转换为Python(使用numpy/scipy和matplotlib)并作为开源分发.我知道MATLAB和Python科学库之间的相似性,并且手动转换它们将不会超过两周(假设我每天都在努力工作一段时间).我想知道是否已经有任何可以进行转换的工具.
我与实验MATLAB OOP,因为一开始我模仿我的C++的记录器类,我把我所有的字符串辅助函数在String类,以为这将是巨大的,能够做的事情一样a + b,a == b,a.find( b )而不是strcat( a b ),strcmp( a, b ),检索的第一元件strfind( a, b ),等
问题:减速
我把上面的东西用上,并立即注意到一个急剧减速.我做错了(这当然有可能,因为我有相当有限的MATLAB经验),还是MATLAB的OOP只是引入了很多开销?
我的测试用例
这是我为字符串做的简单测试,基本上只是附加一个字符串并再次删除附加部分:
classdef String < handle
....
properties
stringobj = '';
end
function o = plus( o, b )
o.stringobj = [ o.stringobj b ];
end
function n = Length( o )
n = length( o.stringobj );
end
function o = SetLength( o, n ) …Run Code Online (Sandbox Code Playgroud) 我的问题:我注意到很多关于SO的Matlab问题的好答案经常使用这个功能bsxfun.为什么?
动机:在Matlab文档中bsxfun,提供了以下示例:
A = magic(5);
A = bsxfun(@minus, A, mean(A))
Run Code Online (Sandbox Code Playgroud)
当然我们可以使用以下方法执行相同的操作:
A = A - (ones(size(A, 1), 1) * mean(A));
Run Code Online (Sandbox Code Playgroud)
事实上,简单的速度测试表明第二种方法的速度提高了约20%.那么为什么要使用第一种方法?我猜测在某些情况下使用bsxfun将比"手动"方法快得多.我真的很想看到这种情况的一个例子,并解释为什么它更快.
此外,这个问题的最后一个元素,再次来自Matlab文档bsxfun:"C = bsxfun(fun,A,B)将函数句柄fun指定的逐元素二元运算应用于数组A和B,使用单例扩展已启用." 短语"启用单例扩展"是什么意思?
是否可以在Matlab中使用默认参数?例如,这里:
function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))
Run Code Online (Sandbox Code Playgroud)
我想让真正的解决方案成为wave函数的可选参数.如果有可能,任何人都可以证明这样做的正确方法吗?目前,我正在尝试上面发布的内容,我得到:
??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.
Run Code Online (Sandbox Code Playgroud) 是否有可能从函数中获取'nth'返回值而不必为n-1之前的所有返回值创建虚拟变量?
比方说,我在MATLAB中有以下功能:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Run Code Online (Sandbox Code Playgroud)
现在假设,我只对第三个返回值感兴趣.这可以通过创建一个虚拟变量来完成:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Run Code Online (Sandbox Code Playgroud)
但我认为这有点难看.我认为你可能会做以下事情之一,但你不能:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
有没有优雅的方法可以做到这一点?
到目前为止,最好的解决方案是简单地使用variableThatIWillUse虚拟变量作为虚拟变量.这使我不必创建一个污染工作空间的真实虚拟变量(或者我需要清除它).简而言之:解决方案是使用variableThatIWillUsefor each返回值直到有趣的值.之后的返回值可以简单地忽略:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Run Code Online (Sandbox Code Playgroud)
我仍然认为这是非常难看的代码,但如果没有更好的方法,那么我想我会接受答案.
我试图在同一个图上绘制几个核密度估计,我希望它们都是不同的颜色.我有一个使用字符串的kludged解决方案,'rgbcmyk'并为每个单独的绘图单步执行,但我在7次迭代后开始重复.是否有更简单/更有效的方法来实现这一目标,并提供更多颜色选项?
for n=1:10
source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
[f,x]=ksdensity(source(n).data); % calculate the distribution
plot(x,f,cstring(mod(n,7)+1)) % plot with a different color each time
end
Run Code Online (Sandbox Code Playgroud) 例如,v + 1您可以通过说,或者您可以使用该函数,将函数应用于向量中的每个项目arrayfun.如何在不使用for循环的情况下为矩阵的每一行/列执行此操作?
考虑以下简单的速度测试arrayfun:
T = 4000;
N = 500;
x = randn(T, N);
Func1 = @(a) (3*a^2 + 2*a - 1);
tic
Soln1 = ones(T, N);
for t = 1:T
for n = 1:N
Soln1(t, n) = Func1(x(t, n));
end
end
toc
tic
Soln2 = arrayfun(Func1, x);
toc
Run Code Online (Sandbox Code Playgroud)
在我的机器上(Linux Mint 12上的Matlab 2011b),该测试的输出是:
Elapsed time is 1.020689 seconds.
Elapsed time is 9.248388 seconds.
Run Code Online (Sandbox Code Playgroud)
什么了?!?arrayfun虽然公认的解决方案更清洁,但速度要慢一个数量级.这里发生了什么?
此外,我做了类似的测试方式cellfun,发现它比显式循环慢约3倍.同样,这个结果与我的预期相反.
我的问题是:为什么是arrayfun和cellfun这么多慢?鉴于此,有没有充分的理由使用它们(除了使代码看起来很好)?
注意:我说的是arrayfun这里的标准版本,而不是并行处理工具箱中的GPU版本.
编辑:为了清楚起见,我知道 …
假设;
我在位置有一个m文件:
C:\M1\M2\M3\mfile.m
和matlab的exe文件在这个位置:
C:\E1\E2\E3\matlab.exe
我想从命令行使用Matlab运行这个m文件,例如在.bat文件中.我怎么能这样做,有办法吗?
matlab ×10
arrays ×2
function ×2
arguments ×1
automation ×1
benchmarking ×1
bsxfun ×1
command-line ×1
default ×1
matlab-class ×1
matplotlib ×1
matrix ×1
numpy ×1
oop ×1
performance ×1
plot ×1
profiling ×1
python ×1
r ×1
return-value ×1
scipy ×1