小编Ber*_* U.的帖子

MATLAB:如何在没有 for 循环的情况下使用一维向量索引对多维矩阵进行子集化?

我目前正在寻找一种在 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维度矩阵的解决方案。

arrays matlab multidimensional-array

4
推荐指数
1
解决办法
262
查看次数

使用MATLAB中的MEX文件访问存储在单元阵列内的矩阵

我目前正在编写一个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'"错误.

c matlab mex

3
推荐指数
1
解决办法
2730
查看次数

确定matlabpool可用的最大处理器数量(MATLAB Parallel Toolbox)

我目前正在MATLAB中编写一些代码,它使用parfor循环来加速一些繁琐的计算.

我的问题是代码将在远程集群上运行,并且可以在4核,8核或12核机器上运行(我不知道提前哪一个)...

我基本上需要一个代码片段,它允许MATLAB确定可以在matlabpool中使用的最大内核数.如果我们称这个变量maxcores,那么我可以继续使用

matlabpool('open',maxcores).

这样我就可以确保我使用的是所有可用的核心.

parallel-processing matlab

3
推荐指数
1
解决办法
6498
查看次数

MATLAB:将字符转换为自定义集合数字和返回的最快方法

我正在寻找一种快速的方法,将小写字母,空格和句点的大字符数组转换为一组整数,反之亦然.

通常我会使用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中是否有更快的方法可以做到这一点?

string matlab

3
推荐指数
1
解决办法
967
查看次数

C:使用查找表评估有限的小整数值函数的最快方法?

我目前正在开发一个项目,我希望通过调用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 编写优化代码,我想知道:

  1. 具体来说 - 因为x真的很大 - 我想知道在评估循环时是否值得进行二度优化(例如通过x预先排序,或者通过找到一种处理负指数的智能方法(除了刚做[x[i] + 10 + 1])?

  2. x[i]不是介于-10和10之间,而是介于-20和20之间.在这种情况下,我仍然可以使用相同的方法,但需要手动硬编码查找表.有没有办法在代码中动态生成查找表,以便我使用相同的方法并允许x[i]属于变量范围?

c

3
推荐指数
1
解决办法
147
查看次数

为什么Math.min([1,2])会返回NaN?

我一直在调试这段代码大约一个小时,看起来像是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)

javascript

3
推荐指数
2
解决办法
4191
查看次数

是否可以在 MATLAB 中实现用户定义的运算符?

我想知道是否可以在 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

2
推荐指数
1
解决办法
601
查看次数

在MATLAB中用数字替换自定义字符串的有效方法

我目前在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)

当然,这对于大型我来说非常慢,我想将每个序列转换为整数值.有更快的方法吗?

matlab

1
推荐指数
1
解决办法
1699
查看次数