小编Cri*_*ngo的帖子

匿名函数中的if-then-else

我试图在匿名函数中使用某种if-then-else语句,该函数本身是的一部分cellfun。我有一个包含多个双矩阵的单元格数组。我想用+1替换所有双精度矩阵中的所有正数,并用-1替换所有负数。我想知道我是否可以使用匿名函数而不是编写一个单独的函数,然后再从中调用它cellfun

这是玩具示例:

mat = [2, 2, 0, -2; -2, 0, 0, 2; -2, 2, -2, 2]
cellarray = repmat({mat}, 3, 1)
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样的东西:

new_cellarray = cellfun(@(x) if x > 0 then x = 1 elseif x < 0 then x = -1, cellarray, 'UniformOutput', false)
Run Code Online (Sandbox Code Playgroud)

我也尝试过此操作,但是,显然不允许我在匿名函数中添加等号。

new_cellarray = cellfun(@(x) x(x > 0) = 1, cellarray, 'UniformOutput', false)
new_cellarray = cellfun(@(x) x(x < 0) = -1, cellarray, 'UniformOutput', false)
Run Code Online (Sandbox Code Playgroud)

matlab anonymous-function cell-array

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

Delete all empty cells in a cell array

I have an array of cells in which I want to select 3 lines so I used this temp = testresults(13:15,1:end).

The array being bigger, I get a lot of empty cells

{'Summary Test Re…'}    {'Overall'   }    {0×0 char          }    {'OVP Transition …'}    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
{'Pass/Fail'       }    {'Passed'    }    {'No Transition t…'}    {'Passed'          }    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}    {0×0 char}
{'Failed cases'    } …
Run Code Online (Sandbox Code Playgroud)

arrays matlab cell-array

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

如何防止图例在 R2017a 及更高版本中更新?

自 MATLAB R2017a 起,当向坐标区添加绘图时,图例图例会自动更新。以前,人们可以这样做:

data = randn(100,4);
plot(data)
legend('line1','line2','line3','line4')
hold on
plot([1,100],[0,0],'k-')
Run Code Online (Sandbox Code Playgroud)

用图例绘制四条数据线,然后为 y=0 添加一条黑线。然而,从 R2017a 开始,这导致图例中添加了黑线,名称为“data1”。

如何防止将此行添加到图例中,以便代码的行为就像在旧版本 MATLAB 中一样?

到目前为止,我在 Stack Overflow 上找到的唯一解决方案是在添加图例项后将其删除。语法不太漂亮:

h = plot([1,100],[0,0],'k-'); % keep a handle to the added line
set(get(get(h,'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
Run Code Online (Sandbox Code Playgroud)

matlab plot legend matlab-figure

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

在Matlab / Python中向量化多个for循环

我正在尝试对数学模型进行编码,它涉及在数千个具有变化的模型参数的值网格上计算特定数量。目前,这太慢了,我正在寻找有关向量化模型中最密集部分的建议。

为了便于阅读,我目前已经有了它的基本实现,但是现在如果可能的话,希望对下面的整个代码段进行矢量化处理。该代码段的一个最小示例是:

% Setup grid to evaluate and results vector
T_max = 10000;
eval_points = linspace(0, T_max, 1000);
results = zeros(size(eval_points));
% Function that is used in computation
Z_func = @(x, omega) (1./(omega.*sqrt(2*pi))).*exp( -(x.^2)./(2.*omega.*omega) );
% Random data for now, known in full problem
historic_weights = rand(1,100);
historic_times   = rand(1,100);
% Fixed single parameter omega
omega            = 0.5;
% Time evaluation
tic()
for eval_counter = 1:size(eval_points,2)
    for historic_counter = 1:size(historic_weights,2)
    temp_result = 0;
        for k = 0:1:T_max
            temp_result = temp_result …
Run Code Online (Sandbox Code Playgroud)

performance matlab vectorization

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

从Matlab中预先指定的概率质量函数中抽取随机数

我在 Matlab 中有一个支持 ( supp_epsilon) 和一个概率质量函数 ( pr_mass_epsilon),构造如下。

supp_epsilon=[0.005 0.01 0.015 0.02]; 

suppsize_epsilon=size(supp_epsilon,2);

pr_mass_epsilon=zeros(suppsize_epsilon,1);

alpha=1;
beta=4;

for j=1:suppsize_epsilon
    pr_mass_epsilon(j)=betacdf(supp_epsilon(j),alpha,beta)/sum(betacdf(supp_epsilon,alpha,beta));
end
Run Code Online (Sandbox Code Playgroud)

请注意, 的分量pr_mass_epsilon总和为1。现在,我想n从 中抽取随机数pr_mass_epsilon。我怎样才能做到这一点?我想要一个适用于任何suppsize_epsilon.

换句话说:我想从 中随机抽取元素supp_epsilon,每个元素的概率为pr_mass_epsilon

random matlab distribution probability-theory

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

在 MATLAB 中绘图后的轴恢复

从文本文件绘制多种方法的输出后,未显示轴的右侧和上侧。我需要拥有它们并像当前轴一样将它们加粗。

绘制的数据来自存储了每种方法数据的文件。每个数据文件都是一个 256x2 的文件,其中包含 [0,1] 之间的值。第一列是精度,第二列是召回率。

figure
hold on
for m = 1:length(methods)
  prFileName = strcat(readpath,dataset, '_', methods{m}, '_PRCurve.txt');
  R = load(prFileName);
  precision = R(:, 1);
  recall = R(:, 2);
  plot(recall, precision,'color',methods_colors(m,:),'linewidth',2);    
end
axis([0 1 0 1]);
hold off
grid on;
legend('methode one','method two')
xlabel('Recall','fontsize',12);
ylabel('Precision','fontsize',12);
set(gcf,'color','w');  %Background color
ax = gca;  % current axes
ax.GridLineStyle='-';
ax.GridAlpha=0.7;
ax.XAxis.LineWidth=4;
ax.YAxis.LineWidth=4;
Grid.LineWidth = 3;
set(gca,'FontName','Arial','FontWeight','bold');
Run Code Online (Sandbox Code Playgroud)

我的输出:

绘制的图形

原始数据:

[0.201612 1.000000;0.473895 0.813213;0.509366 0.775938;0.524163 0.756849;0.536319 0.744732;0.544424 0.734892;0.552313 0.727097;0.557654 0.719293;0.561069 0.713474;0.565138 0.708002;0.568720 0.705004;0.572685 0.702411;0.574115 0.698205;0.576529 0.697134;0.579346 …
Run Code Online (Sandbox Code Playgroud)

matlab plot matlab-figure

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

如何在 MATLAB 中显式地制作数组的深层副本?

例如,我想要做的深层复制ab

>> a=zeros(2,3);
>> b=a;
Run Code Online (Sandbox Code Playgroud)

所以这里=只创建了一个浅拷贝。我的问题是,在这种情况下如何生成深拷贝?我知道我可以添加一个命令

b(1,1)=b(1,1)
Run Code Online (Sandbox Code Playgroud)

使其成为深拷贝。但是有没有更好的方法来做到这一点?

matlab deep-copy shallow-copy copy-assignment

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

访问随机图像像素和最多一次的快速方法

我正在学习 OpenCV (C++),作为一个简单的实践,我设计了一个简单的效果,使一些图像像素变黑或变白。我希望每个像素最多编辑一次;所以我将所有像素的地址添加到向量中。但这让我的代码变得很慢;专门用于大图像或大量效果。这是我的代码:

void effect1(Mat& img, float amount)    // 100 ? amount ? 0
{
    vector<uchar*> addresses;
    int channels = img.channels();
    uchar* lastAddress = img.ptr<uchar>(0) + img.total() * channels;
    for (uchar* i = img.ptr<uchar>(0); i < lastAddress; i += channels) addresses.push_back(i);   //Fast Enough
    size_t count = img.total() * amount / 100 / 2;
    for (size_t i = 0; i < count; i++)
    {
        size_t addressIndex = xor128() % addresses.size();   //Fast Enough, xor128() is a fast random number generator
        for (size_t …
Run Code Online (Sandbox Code Playgroud)

c++ random opencv image-processing

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

无法在 Octave 中加载除 MATLAB 文件以外的文件格式

Octave 可以轻松加载 MATLAB 文件,例如load('names.m'). 但是在尝试加载 MATLAB 文件格式以外的文件格式时,load('names.txt')我收到了一个错误:

错误:加载:无法确定“names.txt”的文件格式

错误-无法找到文本文件

octave

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

数组中值和索引之间的有效一对一映射

我需要获取数组中某个值的索引(即位置),并且我想知道是否存在比使用find命令更快的方法,方法是构造某种包含数组之间映射关系的映射或查找表值和索引。

以这个数组为例:

th = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90];
Run Code Online (Sandbox Code Playgroud)

现在,假设我有一个变量,其值为

angle = 55
Run Code Online (Sandbox Code Playgroud)

并且我想知道此值在数组中的位置(正确答案是idx = 12)。现在,我当然可以使用find

idx = find(th==angle)
Run Code Online (Sandbox Code Playgroud)

但是我的问题是,在我的代码中,我需要进行此查找,以获取数(百万)次中th的值的索引angle,而不断调用该find函数似乎浪费资源,我想它正在循环th并进行某种比较。

相反,我希望有某种方法可以建立一对一的映射或查找表,在这里我可以立即获取对应于我拥有的值的索引angle。(注意:我知道我拥有的值angle将始终与中的值之一完全对应th。)因此,只需具有一些功能

idx = angle2i(angle)
Run Code Online (Sandbox Code Playgroud)

执行此映射:

0 -> 1
5 -> 2
10 -> 3
15 -> 4
20 -> 5
25 -> 6
Run Code Online (Sandbox Code Playgroud)

等等

但是我没有看到如何实现这样的查找(嗯,我有两个非常不优雅的想法,我希望并猜想对此必须有一些聪明的方法)。还是我在这里浪费时间,我应该只使用find …

arrays mapping indexing matlab

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