我想用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)
这段代码有什么问题吗?我怎么能改进它?
正如指出的这个答案由山姆·罗伯茨和由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)
关于冒号运算符的有趣事项:
它的值取决于它的长度:
>> step = 1/3;
>> C = 0:step:5;
>> X = 0:step:3;
>> C(1:10) - X
ans =
1.0e-15 *
0 0 0 0 0 …Run Code Online (Sandbox Code Playgroud)使用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之后运行时,我发现没有符号被导出.无论如何,我可以将默认可见性设置为隐藏,并使用版本脚本(或其他东西)导出符号?
编写子类dynamicprops允许我动态地向对象添加属性:
addprop(obj, 'new_prop')
Run Code Online (Sandbox Code Playgroud)
这很棒,但我也很乐意set / get为这些属性创建功能.或者分析处理这些动态属性的函数.
到目前为止,我对Matlab的经验是,一旦我创建了一个类的实例,就不可能添加新的方法.这非常麻烦,因为我的对象可能包含大量数据,每次我想要添加新方法时都要重新加载(因为我必须这样做clear classes).
那么有没有办法即时添加方法?
我想在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)
我仍然得到同样的警告..
我注意到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) 我一直在研究一个脚本,该脚本使用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) 在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文件?
我有以下问题:在我的matlab代码中我使用的语句如
figure(1)
Run Code Online (Sandbox Code Playgroud)
更改某些数据的目标数字.问题是,在这个matlab之后,系统将重点放在窗口上.
当我在后台运行一个大脚本并尝试在我的计算机上执行smt时--Matlab总是把注意力集中在自己身上而且我不能正常做smt.
是否有禁止Matlab执行此操作的扫管笏?我在Linux Ubuntu工作.
提前致谢.