小编hor*_*ler的帖子

91
推荐指数
5
解决办法
13万
查看次数

如何在类似于Matlab的blkproc(blockproc)函数的块中有效地处理numpy数组

我正在寻找一种有效的方法来有效地将图像分成小区域,分别处理每个区域,然后将每个过程的结果重新组合成单​​个处理过的图像.Matlab有一个名为blkproc的工具(blockproc在较新版本的Matlab中取代).

在理想世界中,函数或类也支持输入矩阵中的分区之间的重叠.在Matlab帮助中,blkproc定义为:

B = blkproc(A,[mn],[mborder nborder],有趣,...)

  • A是你的输入矩阵,
  • [mn]是块大小
  • [mborder,nborder]是边界区域的大小(可选)
  • fun是一个应用于每个块的函数

我已经采取了一种方法,但它让我觉得笨拙,我敢打赌,这是一个更好的方法.冒着我自己的尴尬,这是我的代码:


import numpy as np

def segmented_process(M, blk_size=(16,16), overlap=(0,0), fun=None):
    rows = []
    for i in range(0, M.shape[0], blk_size[0]):
        cols = []
        for j in range(0, M.shape[1], blk_size[1]):
            cols.append(fun(M[i:i+blk_size[0], j:j+blk_size[1]]))
        rows.append(np.concatenate(cols, axis=1))
    return np.concatenate(rows, axis=0)

R = np.random.rand(128,128)
passthrough = lambda(x):x
Rprime = segmented_process(R, blk_size=(16,16), 
                           overlap=(0,0), 
                           fun=passthrough)

np.all(R==Rprime)
Run Code Online (Sandbox Code Playgroud)

python matlab numpy image-processing scipy

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

在Matlab中相当于+ =的是什么?

在Matlab中是否可以增加变量的值而不在语句的右侧重新设置它?

matlab operators

22
推荐指数
2
解决办法
2万
查看次数

在Matlab中以数字方式寻找广义特征向量

我有一个矩阵,例如这个例子(我的实际矩阵可以大得多)

A = [-1 -2   -0.5;
      0  0.5  0;
      0  0   -1];
Run Code Online (Sandbox Code Playgroud)

只有两个线性无关的特征值(重复特征值-1).我想用广义特征向量获得完整的基础.我知道如何做到这一点的一种方法是使用Matlab jordan在Symbolic Math工具箱中的功能,但我更喜欢为数字输入设计的东西(实际上,有两个输出,jordan大型矩阵失败:"MuPAD命令出错:相似矩阵太大").我不需要Jordan规范形式,这在数字上下文中是非常不稳定的,只是一个广义特征向量的矩阵.是否有函数或函数组合以数字稳定的方式自动执行此操作,或者必须使用通用的手动方法(这样的过程有多稳定)?

注意:通过"广义特征向量",我指的是一个非零向量,可用于增加所谓的有缺陷矩阵的不完全基础.我并不是指使用或通过解决广义特征值问题而得到的特征值的特征向量(尽管后一种用法很常见,但我认为最好避免使用).除非有人能纠正我,否则我不相信这两者是一样的.eigqz


更新1 - 五个月后:

请参阅我的答案,了解如何为大于82乘82的矩阵(本问题中的测试矩阵的极限)符号化地获取广义特征向量.

我仍然对数字方案感兴趣(或者如果这些方案都与计算Jordan形式有关,那么这些方案可能会如何不稳定).我不希望盲目地实现已被标记为此问题的副本的线性代数101方法,因为它不是数值算法,而是用于评估学生的铅笔和纸张方法(我认为它可以实现但象征性地).如果有人能指出我对该方案的实施或对其进行数值分析,我会对此感兴趣.

更新2 - 2015年2月:在R2014b中测试的所有上述内容仍然是正确的.

matlab matrix eigenvector

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

如何将{1xN}单元阵列的{Mx1}单元阵列转换为{Mx1单元}阵列的{1xN}单元阵列?

假设它C是具有形状M  ×1 的单元阵列(即,size(C)返回[ M  1]),并且每个元素C又是具有形状1× N的单元阵列  .

我经常要这样的单元阵列转换到新的单元阵列D具有形状1×  Ñ,与元件是单元阵列具有形状中号  ×1,并且使得C{i}{j}等于D{j}{i}对于所有0 <   ≤  中号,和0 <  Ĵ  ≤  Ñ.

我为此使用了以下怪物

D = arrayfun(@(j) arrayfun(@(i) C{i}{j}, (1:M)', 'un', 0), 1:N, 'un', 0);
Run Code Online (Sandbox Code Playgroud)

但是这个操作的需要经常出现(毕竟,它是一种"单元阵列转置"),我想我会问:

是否有更标准的方法来执行此操作?

请注意,所需D的不同

E = cat(2, C{:});
Run Code Online (Sandbox Code Playgroud)

或者,等效地,

E = cat(1, D{:});
Run Code Online (Sandbox Code Playgroud)

E上面是一个二维(中号  ×  Ñ)单元阵列,而这两个CD是一维单元阵列的一维单元阵列.当然,转换E回任何一个C或者D也是另一个经常需要的操作(这种事情永远不会用MATLAB结束),但我会把它留给另一个帖子.


这个问题背后的动机远远超出了上述问题.事实证明,我的MATLAB代码的 …

matlab cell-array

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

为什么在matlab中abs(intmin)〜= -intmin

EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647
Run Code Online (Sandbox Code Playgroud)

这怎么可能?必须存在某种溢出,或者这些函数的定义以奇怪的方式混合在一起.

matlab integer-overflow

9
推荐指数
2
解决办法
315
查看次数

与解析解相比,ODE45和Runge-Kutta方法的绝对误差

如果有人可以帮助解决以下问题,我将不胜感激.我有以下ODE:

dr/dt = 4*exp(0.8*t) - 0.5*r   ,r(0)=2, t[0,1]       (1)
Run Code Online (Sandbox Code Playgroud)

我用两种不同的方式解决了(1).通过Runge-Kutta方法(第4顺序)和ode45Matlab中的方法.我将这两个结果与分析解决方案进行了比较,分析解决方案由下式给出:

r(t) = 4/1.3 (exp(0.8*t) - exp(-0.5*t)) + 2*exp(-0.5*t)
Run Code Online (Sandbox Code Playgroud)

当我根据确切的解决方案绘制每个方法的绝对误差时,我得到以下结果:

对于RK方法,我的代码是:

h=1/50;                                            
x = 0:h:1;                                        
y = zeros(1,length(x)); 
y(1) = 2;    
F_xy = @(t,r) 4.*exp(0.8*t) - 0.5*r;                   
for i=1:(length(x)-1)                              
    k_1 = F_xy(x(i),y(i));
    k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1);
    k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2));
    k_4 = F_xy((x(i)+h),(y(i)+k_3*h));
    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;  % main equation
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

并为ode45:

tspan = 0:1/50:1;
x0 = 2;
f = @(t,r) 4.*exp(0.8*t) - 0.5*r;
[tid, y_ode45] …
Run Code Online (Sandbox Code Playgroud)

matlab numerical-integration ode differential-equations runge-kutta

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

Matlab - 检查函数句柄是否是特定函数或函数类型

问题:在Matlab中,如何检查函数句柄是特定函数还是函数类型?

例如:我们f1是一个函数句柄.如何检查是否f1是内置的Matlab函数mean?如何检查是否f1是匿名函数?

我目前的解决方案:我目前解决此问题的方法是调用该functions函数.functions接受一个函数句柄作为输入,并返回一个包含输入函数句柄信息的结构,例如函数类型,路径,函数名等.它可以工作,但它不是一个理想的解决方案,因为,引用官方文档:

"注意事项MATLAB®仅提供functions用于查询和调试的功能.由于其行为可能会在后续版本中发生变化,因此您不应将其用于编程目的."

matlab function-handle

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

解释计算约旦形式的36乘36矩阵的误差

我一直在试图计算只有三个不同的项目,组成一个36分36矩阵的Jordan标准型1,1/20.矩阵是概率转移矩阵,因此,给定这些条目,矩阵显然是稀疏的.

我一直遇到的问题如下:每当我尝试计算时

[V, J] = jordan(A),
Run Code Online (Sandbox Code Playgroud)

要么

[V, J] = jordan(sym(A)),
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:


在MuPAD命令中使用mupadmex 错误时出错:相似度矩阵太大.

sym/mupadmexnout出错(第1546行)
        out = mupadmex(fcn,args {:});

sym/jordan中的错误(第32行)
        [Vsym,Jsym] = mupadmexnout('symobj :: jordan',A,'All');

我在MATLAB帮助中读到,Jordan形式的计算对扰动非常敏感.但是,我认为我的计算不是问题,因为矩阵的所有条目都是整数或整数比.

我的问题如下:

  1. 如何解释收到的错误输出?
  2. 我收到的错误是否可以解决?
  3. 如果错误不可寻址,是否有替代方法(Matlab中的函数)我可以尝试计算Jordan形式?

matlab matrix linear-algebra symbolic-math numerical-stability

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

在Matlab中列出/查看/清除持久变量

如何在MATLAB中列出/查看/清除持久变量?我希望看到持久变量不是针对特定函数,而是针对目前在内存中具有持久变量的所有函数.

我尝试过的事情一样whos('persistent'),并whos('global')没有运气.

matlab global-variables

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