我在Matlab脚本中有复杂的代码块,它们作用于大型非稀疏数组.该代码对数组中的随机元素以及读取操作执行许多写操作.相同的代码必须针对不同的(大)数组执行(即,相同的代码块,不同的数组变量名称除外).
我不想要只有数组名称不同的长重复代码块.
不幸的是,当我创建一个函数来执行操作时,所以代码块只出现一次,性能会降低10倍或更多(可能是由于复制了数组).但是,我不需要复制数组.我宁愿"通过引用传递",因此函数调用的目的只是为了避免重复的代码块.但是,似乎没有办法避免写时复制语义.
此外,我不可能(据我所知)创建一个脚本(而不是函数)来实现这一点,因为脚本必须包含与调用脚本相同的变量名称,因此我需要为每个数组使用不同的脚本我希望运行脚本,它什么也得不到(我仍然会有重复的代码块).
我已经考虑创建一个别名变量名称来"替换"感兴趣的数组变量名称,在这种情况下,我可以调用脚本并避免重复的代码.但是,我找不到任何在Matlab中创建别名的方法.
最后,我尝试编写一个利用该evalin()函数的函数,并将数组变量的字符串名称传递给此函数,但是虽然这有效,但性能也要慢得多 - 与将值按值传递给函数大致相同(性能至少下降10倍).
我得出的结论是,在Matlab中,在非稀疏数组上执行复杂操作时,避免重复代码块是不可能的,以避免Matlab似乎使用避免重复代码块的任何可能技术所带来的可怕开销.
我觉得很难相信,但我无法找到解决办法.
有没有人知道在Matlab中对多个非稀疏数组执行相同的复杂操作时避免重复代码块的方法?
我正在使用C++ ublas库编写一个Matlab扩展,我希望能够从Matlab插件传递的C数组中初始化我的ublas向量.如何在没有(为了提高效率)显式复制数据的情况下从C数组初始化ublas向量.我正在寻找以下代码行:
using namespace boost::numeric::ublas;
int pv[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
vector<int> v (pv);
Run Code Online (Sandbox Code Playgroud)
通常,是否可以std::vector从数组初始化C++ ?像这样的东西:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv, pv+4);
pv[0] = 0;
cout << "v[0]=" << v[0] << " " << "pv[0]=" << pv[0] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但初始化不会复制数据.在这种情况下输出是
v[0]=4 pv[0]=0
Run Code Online (Sandbox Code Playgroud)
但我希望输出相同,更新C数组会更改C++向量指向的数据
v[0]=0 pv[0]=0
Run Code Online (Sandbox Code Playgroud)