我正在使用符号工具箱来生成matlab函数.但是生成函数的输入数量随着我需要的对象数量(例如,开关数量)而变化.对于2和3个开关,生成的函数看起来像这样:
y = fun(a1,a2,b1,b2)
y = fun(a1,a2,a3,b1,b2,b3)
Run Code Online (Sandbox Code Playgroud)
在使用此函数的脚本中,我建立了这些参数的向量:
a = [a1 a2 ...]
Run Code Online (Sandbox Code Playgroud)
我想要的是直接调用生成的函数或者创建一个包装器函数,这样我在更改开关数时就不需要更改调用语句了.为了使这个问题更加复杂,这些变量是ACADO变量.这意味着不允许矩阵和元素操作(即,必须使用标量完成所有数学运算,并且必须为标量编写符号工具箱中的公式).
我正在构建客户端 - 服务器聊天应用程序.
它有服务器和客户端部分.
是否可以在同一台机器上测试应用程序,或者我真的需要两台不同的计算机来运行应用程序.
我发现了一个非常棘手的问题,我似乎无法轻易解决这个问题.简而言之,我想从一个mex文件返回一个数组,该数组已作为mex函数输入传递.你可以琐碎地做到这一点:
void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
pargout[0] = pargin[0];
}
Run Code Online (Sandbox Code Playgroud)
但这不是我需要的.我希望得到原始指针pargin[0],在内部处理它,并通过设置相应的数据指针返回一个新创建的mex数组.像那样:
#include <mex.h>
void mexFunction(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[])
{
mxArray *outp;
double *data;
int m, n;
/* get input array */
data = mxGetData(pargin[0]);
m = mxGetM(pargin[0]);
n = mxGetN(pargin[0]);
/* copy pointer to output array */
outp = mxCreateNumericMatrix(0,0,mxDOUBLE_CLASS,mxREAL);
mxSetM(outp, m);
mxSetN(outp, n);
mxSetData(outp, data);
/* segfaults with or without the below …Run Code Online (Sandbox Code Playgroud) 在现代多核平台上,内存带宽有限的应用程序的并行性能通常无法随着核心数量的增加而很好地扩展。通常,在达到一定数量的核心时会观察到加速,但之后性能就会饱和。一个综合的例子是众所周知的STREAM benchmark,它通常用于报告可实现的内存带宽,即饱和点处的内存带宽。
请考虑在峰值内存带宽为 42.7GB/s (DDR3-1333) 的单个 Xeon E5-2680 上进行 STREAM 基准测试 (Triad) 的以下结果:
1 core 16 GB/s
2 cores 30 GB/s
3+ cores 36 GB/s
Run Code Online (Sandbox Code Playgroud)
STREAM 从 1 核扩展到 2 核时可以很好地扩展,但在 3 核以上,性能大致保持不变。
我的问题是:什么决定了单个CPU核心可以达到的内存带宽?由于这个问题肯定太宽泛,所以我将其缩小到上述架构:如何根据 E5-2680 的规格或通过查看硬件计数器等来预测具有 1 个线程的 STREAM 将为我提供 16 GB/s ?
我有两个向量a和b以及一些函数f.在这样的MATLAB中定义矩阵的最佳方法(性能)是什么:
A(m,n) = f(a(m)*b(n)) / ( (f(a(m)) * f(b(n)) )
Run Code Online (Sandbox Code Playgroud)
有可能不使用嵌套循环吗?
我有一个来自net的matlab脚本,它从初始值生成偶数.这是代码.
n = [1 2 3 4 5 6];
iseven = [];
for i = 1: length(n);
if rem(n(i),2) == 0
iseven(i) = i;
else iseven(i) = 0;
end
end
iseven
Run Code Online (Sandbox Code Playgroud)
它的结果是这样的
iseven =
0 2 0 4 0 6
Run Code Online (Sandbox Code Playgroud)
在结果我得到偶数和零,是否有任何方法我可以删除零并获得这样的结果
iseven =
2 4 6
Run Code Online (Sandbox Code Playgroud) 如果我有一个矩阵,如果我有一个矩阵,如果我调用单维索引,结果将是一个数组.我不知道为什么在Matlab中如果你采用矩阵的单个索引,你会得到一个元素,这是愚蠢的.
无论如何在C:
mat[4][4];
Run Code Online (Sandbox Code Playgroud)
mat [0]是一个数组.
在Matlab中:
mat=[1 2; 3 4];
Run Code Online (Sandbox Code Playgroud)
如何获取矩阵的第一行?mat(1)是1,而不是[1 2].
编辑:还有一个问题,我有这个功能的问题:
function str= split(string, del)
index=1;
found=0;
str=['' ; ''];
for i=1:length(string)
if string(i)==del
found=1;
index=1;
elseif found==1
str(2,index)=string(i);
index=index+1;
else
str(1,index)=string(i);
index=index+1;
end
end
end
Run Code Online (Sandbox Code Playgroud)
这有时返回矩阵,有时返回数组.
例如,如果我使用split('FF','.')我得到'FF'作为结果,但如果我想返回矩阵怎么办?我甚至无法选择矩阵的维度,在这种情况下,弱类型语言是一个很大的优势.
我想改进一个简单的matlab函数.有没有算术方法来实现这个功能?我认为这会表现得更好.
function img_output = cutchannels(img_input, min, max)
[r c l] = size(img_input);
img_output = double(img_input);
for i = 1:r
for j = 1:c
for k = 1:l
if(img_output(i:j:k)> max)
img_output(i:j:k) = max;
elseif(img_output(i:j:k) < min)
img_output(i:j:k) = min;
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)