小编Cri*_*ngo的帖子

迭代矩阵列的最佳方法是什么?

我想用MATLAB将函数应用于矩阵中的所有列.例如,我希望能够在矩阵的每一列上调用平滑,而不是将矩阵平滑地视为向量(如果调用则这是默认行为smooth(matrix)).

我敢肯定必须有更惯用的方法来做到这一点,但我找不到它,所以我定义了一个map_column函数:

function result = map_column(m, func)
    result = m;
    for col = 1:size(m,2)
        result(:,col) = func(m(:,col));
    end
end
Run Code Online (Sandbox Code Playgroud)

我可以打电话给:

smoothed = map_column(input, @(c) (smooth(c, 9)));
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题吗?我怎么能改进它?

matlab enumeration matrix

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

如何检测目标上的弹孔

我想知道如何使用Python和OpenCV检测目标上的弹孔.

我无法画出周围的轮廓.到目前为止,我已经应用了一个阈值,我有以下结果(阈值后的图像和二进制AND):

这是原始图像: 在此输入图像描述

我不知道应该采用哪种方法来检测弹孔并相应地计算得分.

python opencv image-processing

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

MATLAB的冒号运算符如何工作?

正如指出的这个答案由山姆·罗伯茨由gnovice这对方的回答,MATLAB的冒号运算符(start:step:stop)创造价值的在用不同的方式矢量linspace一样.Sam Roberts特别指出:

冒号运算符将增量添加到起始点,并从结束点减去减量以达到中间点.这样,它确保输出向量尽可能对称.

但是,有关The MathWorks的官方文档已从其网站中删除.

如果Sam的描述是正确的,步长中的错误不会是对称的吗?

>> step = 1/3;
>> C = 0:step:5;
>> diff(C) - step
ans =
   1.0e-15 *
  Columns 1 through 10
         0         0    0.0555   -0.0555   -0.0555    0.1665   -0.2776    0.6106   -0.2776    0.1665
  Columns 11 through 15
    0.1665   -0.2776   -0.2776    0.6106   -0.2776
Run Code Online (Sandbox Code Playgroud)

关于冒号运算符的有趣事项:

matlab vector colon

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

版本脚本和隐藏的可见性

使用gcc构建共享库时,可以使用限制符号的可见性-fvisibility=hidden.我还了解到,您可以使用version-script选项限制可见性ld.

现在我想知道是否可以将这些结合起来.假设我有一个包含以下内容的程序:

void foobar() {}
void say_hello() {}
Run Code Online (Sandbox Code Playgroud)

然后我有版本脚本文件:

{
  global:
    foobar;
}
Run Code Online (Sandbox Code Playgroud)

我编译它:

gcc -fvisibility=hidden -Wl,--version-script=<version-script> test.c -shared -o libtest.so
Run Code Online (Sandbox Code Playgroud)

当我nm之后运行时,我发现没有符号被导出.无论如何,我可以将默认可见性设置为隐藏,并使用版本脚本(或其他东西)导出符号?

gcc shared-libraries ld

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

是否可以动态添加方法到matlab类(面向对象编程)?

编写子类dynamicprops允许我动态地向对象添加属性:

addprop(obj, 'new_prop')
Run Code Online (Sandbox Code Playgroud)

这很棒,但我也很乐意set / get为这些属性创建功能.或者分析处理这些动态属性的函数.

到目前为止,我对Matlab的经验是,一旦我创建了一个类的实例,就不可能添加新的方法.这非常麻烦,因为我的对象可能包含大量数据,每次我想要添加新方法时都要重新加载(因为我必须这样做clear classes).

那么有没有办法即时添加方法?

oop matlab class dynamic-properties

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

如何在DoxyGen内联代码中转义特殊命令

我想在DoxyGen注释中使用内联代码:

Use `#define` for something..
Run Code Online (Sandbox Code Playgroud)

产生以下警告:

warning: explicit link request to 'define' could not be resolved
Run Code Online (Sandbox Code Playgroud)

如何逃避#符号以省略此警告?

如果我像这样使用反斜杠(\):

Use `\#define` for something..
Run Code Online (Sandbox Code Playgroud)

我仍然得到同样的警告..

c c++ doxygen

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

std :: complex乘法非常慢

我注意到std::complex使用重载*运算符比使用写出操作要多得多两倍.我看到了50倍的差异.这完全是荒谬的.我知道运算符需要在输入中检查NaN,因为定义了无穷大的复杂程度.这真的能说明50倍的时差吗?

我正在使用带有标志的GCC 5.4.0 -O3 -mavx -mavx2 -msse2 -mfma -mbmi.

这是测试代码:

#include <iostream>
#include <complex>
#include <chrono>
#include <vector>

int main( void ) {
  size_t N = 10000;
  std::vector< std::complex< double >> inbuf( N );
  for( size_t k = 0; k < N; ++k ) {
     inbuf[ k ] = std::complex< double >( std::rand(), std::rand() ) / ( double )RAND_MAX - 0.5;
  }

  std::complex< double > c2 = { 0, 0 };
  auto t0 = std::chrono::steady_clock::now(); …
Run Code Online (Sandbox Code Playgroud)

gcc c++-standard-library

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

使用相位相关和对数极坐标变换获得旋转位移

我一直在研究一个脚本,该脚本使用cv2的phaseCorrelate方法计算两个图像之间的旋转位移。

我有两个图像,第二个是第一个图像的90度旋转版本。加载图像后,我将它们转换为对数极性,然后再将其传递给phaseCorrelate函数。

根据我的阅读,我相信这应该会在两个图像之间产生旋转移位。

下面的代码描述了实现。


#bitwise right binary shift function
def rshift(val, n): return (val % 0x100000000)

base_img = cv2.imread('img1.jpg')
cur_img = cv2.imread('dataa//t_sv_1.jpg')

curr_img = rotateImage(cur_img, 90)

rows,cols,chan = base_img.shape
x, y, c = curr_img.shape

#convert images to valid type
ref32 = np.float32(cv2.cvtColor(base_img, cv2.COLOR_BGR2GRAY))
curr32 = np.float32(cv2.cvtColor(curr_img, cv2.COLOR_BGR2GRAY))

value = np.sqrt(((rows/2.0)**2.0)+((cols/2.0)**2.0))
value2 = np.sqrt(((x/2.0)**2.0)+((y/2.0)**2.0))

polar_image = cv2.linearPolar(ref32,(rows/2, cols/2), value, cv2.WARP_FILL_OUTLIERS)
log_img = cv2.linearPolar(curr32,(x/2, y/2), value2, cv2.WARP_FILL_OUTLIERS) 

shift = cv2.phaseCorrelate(polar_image, log_img)

sx = shift[0][0]
sy = shift[0][1]
sf …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing computer-vision

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

升级到macOS Mojave后,MATLAB不再卸载MEX文件

在MATLAB中,clear mex从内存中卸载所有MEX文件(除非它们已被锁定)。在macOS的早期版本中,仅通过发出clear mex命令,我就可以重新编译MEX文件并运行修改后的版本,而无需重新启动MATLAB 。在莫哈韦沙漠下,这不再可能。

例如,使用以下简单的MEX文件(get_data_pointer.c):

#include "mex.h"

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
  plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
  *(uint64_t*)mxGetData(plhs[0]) = (uint64_t)mxGetData(prhs[0]);
}
Run Code Online (Sandbox Code Playgroud)

我们可以创建MEX文件并将其加载到内存中

mex get_data_pointer.c
get_data_pointer(0)
Run Code Online (Sandbox Code Playgroud)

为了清除它,

clear mex
[~,mexfiles] = inmem
version -modules
Run Code Online (Sandbox Code Playgroud)

inmem确实返回了一个空单元格数组,指示未在内存中加载MEX文件,但是version -modules(未记录,根据此答案)仍显示/Users/cris/matlab/get_data_pointer.mexmaci64在其输出中。更改MEX文件的源代码并重新编译表明,确实从未重新加载MEX文件,旧版本仍在运行,直到有人退出MATLAB。

我在macOS Mojave的MATLAB R2017a上看到了这一点。在High Sierra下使用相同的MATLAB版本从来没有问题。

如何强制MATLAB在不重新启动的情况下卸载MEX文件?

c macos matlab shared-libraries mex

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

禁止Matlab自动获取焦点

我有以下问题:在我的matlab代码中我使用的语句如

figure(1)
Run Code Online (Sandbox Code Playgroud)

更改某些数据的目标数字.问题是,在这个matlab之后,系统将重点放在窗口上.

当我在后台运行一个大脚本并尝试在我的计算机上执行smt时--Matlab总是把注意力集中在自己身上而且我不能正常做smt.

是否有禁止Matlab执行此操作的扫管笏?我在Linux Ubuntu工作.

提前致谢.

matlab matlab-figure

8
推荐指数
2
解决办法
2481
查看次数