相关疑难解决方法(0)

Vectorize函数使用arrayfun输出一行,返回一个矩阵

我正在使用Octave,并且想要一个接受单个实数作为输入的函数,并输出一个固定长度的行向量.我明白arrayfun应该能够从不清楚的文档中做到这一点.从help arrayfunOctave 3.2开始:

如果在另一个字符串输入参数"UniformOutput"之后的参数VAL设置为"true"(默认值),则命名函数FUNC必须返回单个元素,然后该元素将连接到返回值并且是matrix类型.否则,如果该参数设置为"false",则输出将在单元数组中连接.

然而,似乎Matlab的版本更宽容:

[B1,...,Bm] = arrayfun(func,A1,...,An)调用函数handle func指定的函数,并传递来自数组A1,...,An的元素,其中n是输入的数量功能函数.输出数组B1,...,Bm,其中m是函数func的输出数,包含函数调用的组合输出.第i次迭代对应于语法[B1(i),...,Bm(i)] = func(A1 {i},...,An {i}).arrayfun函数不按特定顺序执行函数func的调用.

看起来这在Matlab中有效,但在Octave中无效.我是否认为arrayfun在Octave中无法使用此推广?是否有一些更聪明的方法来实现这一点,而不诉诸非流量化的循环?

作为参考,这是我的Octave结果:

octave:5> nums
nums =

@(c)([c,c + 2,c + 4])

octave:6> arrayfun(nums,[1,2,3])
错误:cellfun:期望所有值都是UniformOutput = true的标量
错误:调用自:
error:/opt/local/share/octave/3.2.4/ m/general/arrayfun.m在第168行,第21行
八度:6>

matlab vectorization octave

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

如何在较大矩阵的子集上矢量化运行函数的代码?

我们假设我有以下9 x 5矩阵:

myArray = [
   54.7    8.1   81.7   55.0   22.5
   29.6   92.9   79.4   62.2   17.0
   74.4   77.5   64.4   58.7   22.7
   18.8   48.6   37.8   20.7   43.5
   68.6   43.5   81.1   30.1   31.1
   18.3   44.6   53.2   47.0   92.3
   36.8   30.6   35.0   23.0   43.0
   62.5   50.8   93.9   84.4   18.4
   78.0   51.0   87.5   19.4   90.4
];
Run Code Online (Sandbox Code Playgroud)

我有11个这个矩阵的"子集",我需要max在每个子集上运行一个函数(比方说).可以使用以下逻辑逻辑来识别子集(按列标识,而不是按行标识):

myLogicals = logical([
    0 1 0 1 1
    1 1 0 1 1
    1 1 0 0 0
    0 1 0 1 1
    1 0 …
Run Code Online (Sandbox Code Playgroud)

matlab vectorization

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

有没有办法在MATLAB中执行函数内联?

我可以使用什么语言功能或开箱即用的黑客来完成MATLAB中的函数内联?令人讨厌的是,Google搜索"matlab内联函数"表明,MATLAB的设计者认为"内联"意味着"用字​​符串构造一个匿名函数"(... wtf?).

我问的原因是我正在编写一个需要快速运行的脚本,而且我遇到很多情况,让一个帮助函数处理一些简单的添加或者某些东西来避免一个一个错误.但是,函数调用的成本(以度量衡量tic/toc)是不值得的.我拒绝相信MATLAB缺少函数内联功能,因为这会阻止分解!

最糟糕的情况是,我可以使用M4宏.


编辑:回应吃的评论,这里是一个我可能想要帮助内联的情况:

有一次,我需要windowWidth在列表中的所有宽度窗口上循环(是的,我知道):

lastWindowStartIdx = length(list) - windowWidth + 1;
for windowStartIdx = 1:lastWindowStartIdx
   display(list[windowStartIdx:windowStartIdx+windowWidth-1]); %the window we're looking at
end
Run Code Online (Sandbox Code Playgroud)

如果能够分解那些棘手的,逐个错误的windowWidth计算,那将是很好的.例如:

lastWindowStartIdx = calcLastWindowStartIdx(length(list), windowWidth);
for windowStartIdx = 1:lastWindowStartIdx
   display(list[windowStartIdx:calcWindowEndIdx(windowStartIdx, windowWidth)]); %the window we're looking at
end
Run Code Online (Sandbox Code Playgroud)

syntax macros matlab inline function

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

Matrix Multiply> for loop> bsxfun - 奇数速度结果

我有一个n乘n矩阵A,一组n个系数k(n乘1),以及一个叫做row(1乘n)的矩阵.我的目标是从第i行的第i行中减去第k行中第i个系数加权的行.我有三个问题:为什么我的for-loop表现优于内置矩阵乘法,一般来说,是什么解释了每种方法的优越性接下来,还有比我提出的三个方法更好的方法吗?

% Define row & coefficients used in each method
k = (1:1000).';
row = 1:1000;

% Method 1 (matrix multiply) ~15 seconds
A = magic(1e3);
tic;
for z = 1:1e3
    A = A - k*row;
end
toc;
% Method 2 (for loop) ~11 seconds
B = magic(1e3);
tic;
for z = 1:1e3
    for cr = 1:1000
        B(cr,:) = B(cr,:) - k(cr)*row;
    end
end
toc;
% method 3 (bsxfun) ~ 4 seconds
C = magic(1e3);
tic;
for z = 1:1e3 …
Run Code Online (Sandbox Code Playgroud)

performance matlab loops matrix bsxfun

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

有没有更简单的方法在Matlab中构造Mandelbrot集?

下面显示的代码用于绘制Mandelbrot集,我认为我的代码有点冗余来构建Matrix M.在Python中,我知道有一个干净的方法,

M = [[mandel(complex(r, i)) for r in np.arange(-2, 0.5,0.005) ] for i in np.range(-1,1,0.005)]

在Matlab中有类似的方法吗?

function M=mandelPerf()
rr=-2:0.005:0.5;
ii=-1:0.005:1;
M = zeros(length(ii), length(rr));
id1 = 1;
for i =ii
    id2 = 1;
    for r = rr
        M(id1, id2) = mandel(complex(r,i));
        id2 = id2 + 1;
    end
    id1 = id1 + 1;
end
end

function n = mandel(z)
n = 0;
c = z;
for n=0:100
    if abs(z)>2
        break
    end
    z = z^2+c; …
Run Code Online (Sandbox Code Playgroud)

python matlab matrix

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

如何根据另一个矩阵的值在矩阵中设置索引值

说我有一个矩阵 A

A =
 0     1     2
 2     1     1
 3     1     2
Run Code Online (Sandbox Code Playgroud)

和另一个矩阵 B

B =
 0    42
 1    24
 2    32
 3    12
Run Code Online (Sandbox Code Playgroud)

我想将每个值替换A为与之关联的值B.

我会得到的

A =
 42     24     32
 32     24     24
 12     24     32
Run Code Online (Sandbox Code Playgroud)

如果没有循环我怎么能这样做?

matlab matrix vectorization

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

使用Cellfun多次在单个阵列上执行功能

我希望使用cellfun类似于如何使用bsxfun在nx1单元格和1x1单元格上应用函数,即对于bsxfun,

multi = bsxfun(@times, rand(1,10), 2)
Run Code Online (Sandbox Code Playgroud)

然而,当在cellfun中做这样的事情时,它会抱怨细胞大小不一样.我该如何解决这个问题?

要用于单元格示例:

我的实际问题非常简单,我可以看到其他方法,但我最初的直觉是使用cellfun.不能把我带到这里.这是我的实际问题,

use_var = {[0,1,0,1,1,1,1,0]}; rule_dep = {[1,3],[1,2,4],[3,5,7],[5],[4,8]};
Run Code Online (Sandbox Code Playgroud)

我现在希望每个rule_dep都使用indexuse_var.我的第一次尝试是,

use_rule = cellfun(@(x,y) y{x}, rule_depend, use_var, 'Uniformoutput', false);
Run Code Online (Sandbox Code Playgroud)

但会引发尺寸问题.

matlab

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

在MATLAB中创建循环以找到方法

所以我在MATLAB中有2个矩阵.如果其中一个是100 X 2矩阵,如下所示:

[a b]
[13 19]
[21 39]
[35 45] 
Run Code Online (Sandbox Code Playgroud)

等.等.

另一个矩阵是NX 1矩阵,其值如下:

[1]
[3]
[5]
[7]
Run Code Online (Sandbox Code Playgroud)

等.等.

我要做的是找到第二个矩阵的'a'到'b'的所有元素的Mean值.

到目前为止我得到的是:(如果我的第一个矩阵被称为:MATRIX1

第二个矩阵称为:MATRIX2)

a= MATRIX1(1:1)
b= MATRIX1(1:2)
values = MATRIX2(a:b)
mean(values)
Run Code Online (Sandbox Code Playgroud)

这给了我我想要的,从a到b的值的平均值.但是如何创建循环以便我可以自动为MATRIX 1中的所有行执行此操作?

谢谢!

更新:我想出了如何获得循环,但现在我不知道如何获取所有值并使其成为100 X 1矩阵.这是我使用的代码:

c= size(MATRIX1,1);

for k= 1:c;
    a= MATRIX1(k,1);
    b= MATRIX1(k,2);
    values= MATRIX2(a:b);
    d= mean(values)
end
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到100的d值.如何将这些值放入100 X 1矩阵?

matlab

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

当在非常大的矩阵中对每一行执行操作时,如何避免MATLAB中的for循环?

我正在使用MATLAB.我有非常大的 稀疏矩阵,我想执行logicalbsxfun在这个矩阵中的每一列.有一个for循环,其中有一个logical填充稀疏矩阵的操作.在这里,我包含一个带有一些虚假小数据的示例函数,以查看我正在尝试做什么;

function maskMat()
graph_temp = round(rand(10,10));
tic;
com_mat = round(rand(10,10));
com = round(rand(10,1));
for ii=1:length(graph_temp)    
    com_mat(:,ii) = logical(com ~= com(ii));
    %bsxfun works too but is slightly slower
    %com_mat(:,ii) =  bsxfun(@ne,com,com(ii));
end
toc;
com_mat = graph_temp .* com_mat;

graph_temp并且com_mat大约有1M行和列,并且代码对for循环来说非常慢.关于SO还有另一个相关的问题,但我还没有理解它背后的理论,看看我是否也可以将这些解决方案应用于这个问题.

我想要编写一个mexc ++函数或尝试获得某种嵌套,arrayfun以便每个logical/ bsxfun操作被调用为更大函数的子例程,以避免for循环瓶颈.

matlab matrix sparse-matrix adjacency-matrix bsxfun

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