我目前正在寻找一种在 MATLAB 中对多维矩阵进行切片的有效方法。举个例子,假设我有一个多维矩阵,例如
A = rand(10,10,10)
我想B在每个维度的某些索引处获得这个矩阵的一个子集(我们称之为)。为此,我可以访问每个维度的索引向量:
ind_1 = [1,4,5]
ind_2 = [1,2]
ind_3 = [1,2]
Run Code Online (Sandbox Code Playgroud)
现在,我这样做效率很低,如下所示:
N1 = length(ind_1)
N2 = length(ind_2)
N3 = length(ind_3)
B = NaN(N1,N2,N3)
for i = 1:N1
for j = 1:N2
for k = 1:N3
B(i,j,k) = A(ind_1(i),ind_2(j),ind_3(k))
end
end
end
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种更聪明的方法可以做到这一点。理想情况下,我正在寻找一种不使用 for 循环并且可以用于任意N维度矩阵的解决方案。
我目前正在编写一个MEX函数,它必须在MATLAB中使用单元数组.MEX文件用C语言编写.
本质上,我的函数的输入将是一个单元格数组,其中每个条目都是具有实数值的数字矩阵.一个简单的例子是:
C = cell(1,2);
C{1} = ones(10,10);
C{2} = zeros(10,4);
Run Code Online (Sandbox Code Playgroud)
我希望能够访问我的MEX文件中的数字数组C {1}和C {2}.理想情况下,我想这样做而不必在我的MEX文件中创建数据的第二个副本(即获取它们的指针).
使用前面的示例,我目前的方法如下:
/* declare a pointer variable to the incoming cell array after it is passed to the MEX function */
mxArray C_CELL = (mxArray *) mxGetData(prhs[0])
/* declare a 2 x 1 array of pointers to access the cell array in C */
double *myarray[2] //
/* point towards the contents of C_CELL */
myarray[0] = mxGetPr(C_CELL[0])
myarray[1] = mxGetPr(C_CELL[1])
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎产生了"无效使用未定义类型'struct mxArray_tag'"错误.
我目前正在MATLAB中编写一些代码,它使用parfor循环来加速一些繁琐的计算.
我的问题是代码将在远程集群上运行,并且可以在4核,8核或12核机器上运行(我不知道提前哪一个)...
我基本上需要一个代码片段,它允许MATLAB确定可以在matlabpool中使用的最大内核数.如果我们称这个变量maxcores,那么我可以继续使用
matlabpool('open',maxcores).
这样我就可以确保我使用的是所有可用的核心.
我正在寻找一种快速的方法,将小写字母,空格和句点的大字符数组转换为一组整数,反之亦然.
通常我会使用double和char函数,但我想使用一组特殊的整数来表示每个字母(这样'a'匹配'1','b'匹配'2'....' z'与26匹配,''与27匹配,'.'与28匹配)
我目前的方法是:
text = 'quick brown fox jumps over dirty dog';
alphabet ='abcdefghijklmnopqrstuvwxyz .';
converted_text = double(text);
converted_alphabet = double(alphabet);
numbers = nan(28,1)
for i = 1:28
numbers(converted_text(i)==converted_alphabet(i)) = i;
end
newtext = nan(size(numbers))
for i = 1:size(numbers,1)
newtext(numbers==i) = alphabet(i)
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于大型数组而言,这需要相当长的时间,我想知道在MATLAB中是否有更快的方法可以做到这一点?
我目前正在开发一个项目,我希望通过调用C来优化Python中的一些数值计算.
简而言之,我需要计算y[i] = f(x[i])一个巨大数组中每个元素的值x(通常有10^9条目或更多).这里,x[i]是一个介于-10和10之间的整数,是一个f获取x[i]并返回double的函数.我的问题是,f但需要很长时间才能以数值稳定的方式进行评估.
为了加快速度,我想将所有2*10 + 1可能的值硬编码f(x[i])到常量数组中,例如:
double table_of_values[] = {f(-10), ...., f(10)};
然后f使用"查找表"方法进行评估,如下所示:
for (i = 0; i < N; i++) {
y[i] = table_of_values[x[i] + 11]; //instead of y[i] = f(x[i])
}
Run Code Online (Sandbox Code Playgroud)
由于我不是很精通用C 编写优化代码,我想知道:
具体来说 - 因为x真的很大 - 我想知道在评估循环时是否值得进行二度优化(例如通过x预先排序,或者通过找到一种处理负指数的智能方法(除了刚做[x[i] + 10 + 1])?
说x[i]不是介于-10和10之间,而是介于-20和20之间.在这种情况下,我仍然可以使用相同的方法,但需要手动硬编码查找表.有没有办法在代码中动态生成查找表,以便我使用相同的方法并允许x[i]属于变量范围?
我一直在调试这段代码大约一个小时,看起来像是Math.min([1,2])返回NaN.
var int_array = [1,2]
console.log(Math.min(int_array)) //prints NaN, but expect 1
isNaN(Math.min(int_array))===true
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在 MATLAB 2013a 中创建我自己的运算符。
例如,假设我想定义一个新运算符===来检查两个矩阵之间的所有元素是否相等。在这种情况下,
x = ones(10,1);
y = ones(10,1);
z = 2*ones(10,1);
all(x==y) = 1
x===y = 0
all(z==y) = 0
z===y =0
Run Code Online (Sandbox Code Playgroud)
有可能实现这样的东西吗?如果是这样,我该怎么办?
我目前在MATLAB中有一个包含序列号列表的单元格数组.序列号基本上是没有任何特定结构的字符串 - 所以我的单元格数组是这样的:
serial_numbers = {'serial1'; 'SERIAL1'; 'S2'; 'serial31010'}
鉴于serial_numbers中的每个唯一字符串对应不同的项目,我想为每个字符分配一个整数值...所以我可以更改
serial_numbers = {'serial1'; 'SERIAL1'; 'S2'; 'serial31010'}
成
new_serial_numbers = [1;1;2;3]
Run Code Online (Sandbox Code Playgroud)
现在,我通过使用如下的unique和strcmp函数来实现这一点
unique_serial_numbers = unique(serial_numbers);
new_serial_numbers = nan(size(serial_numbers));
for i = 1:length(unique_serial_numbers)
new_serial_numbers(strcmp(serial_numbers,unique_serial_numbers(i))) = i;
end
Run Code Online (Sandbox Code Playgroud)
当然,这对于大型我来说非常慢,我想将每个序列转换为整数值.有更快的方法吗?