【问题标题】:How to make a diagonal divider of zeros and ones using Matlab?如何使用Matlab制作零和一的对角线分隔符?
【发布时间】:2014-10-01 08:54:50
【问题描述】:

这是我想要的结果。 位数分辨率为256 x 256

// assign default background to white.
img = ones(256, 256);

示例结果:

0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0

有没有办法可以在 MATLAB 中使用 zeros()ones() 函数来实现这个结果?我应该如何进行循环?

结果是eye() 函数可以做的事情,但它只做对角线。我想要一条分隔零和一的对角线。

【问题讨论】:

    标签: matlab image-processing matrix diagonal


    【解决方案1】:

    您正在寻找triu 函数

    img = triu( ones( 256 ), 1 );
    

    【讨论】:

    • 谢谢,这真的很有帮助:)
    【解决方案2】:

    如果您关心性能,可以尝试基于bsxfun 的方法-

    n = 256; %// resolution of img would be nxn
    img = bsxfun(@le,[1:n]',0:n-1);
    

    比较 BSXFUN 和 TRIU 的基准 -

    num_runs = 50000; %// Number of iterations to run benchmarks
    n =  256; %// nxn would be the resolution of image
    
    %// Warm up tic/toc.
    for k = 1:50000
        tic(); elapsed = toc();
    end
    
    disp(['For n = ' num2str(n) ' :'])
    disp('---------------------- With bsxfun')
    tic
    for iter = 1:num_runs
        out1 = bsxfun(@le,[1:n]',0:n-1); %//'
    end
    time1 = toc;
    disp(['Avg. elapsed time = ' num2str(time1/num_runs) ' sec(s)']),clear out1
    
    disp('---------------------- With triu')
    tic
    for iter = 1:num_runs
        out2 = triu( true( n ), 1 );
    end
    time2 = toc;
    disp(['Avg. elapsed time = ' num2str(time2/num_runs) ' sec(s)']),clear out2
    

    结果

    For n = 256 :
    ---------------------- With bsxfun
    Avg. elapsed time = 0.0001506 sec(s)
    ---------------------- With triu
    Avg. elapsed time = 4.3082e-05 sec(s)
    
    For n = 512 :
    ---------------------- With bsxfun
    Avg. elapsed time = 0.00035545 sec(s)
    ---------------------- With triu
    Avg. elapsed time = 0.00015582 sec(s)
     
    For n = 1000 :
    ---------------------- With bsxfun
    Avg. elapsed time = 0.0015711 sec(s)
    ---------------------- With triu
    Avg. elapsed time = 0.0019307 sec(s)
    
    For n = 2000 :
    ---------------------- With bsxfun
    Avg. elapsed time = 0.0058759 sec(s)
    ---------------------- With triu
    Avg. elapsed time = 0.0083544 sec(s)
    
    For n = 3000 :
    ---------------------- With bsxfun
    Avg. elapsed time = 0.01321 sec(s)
    ---------------------- With triu
    Avg. elapsed time = 0.018275 sec(s)
    

    基准测试的结论

    对于256x256 大小的问题,triu 可能是首选方法,但对于足够大的数据量,可以查看bsxfun 以获得高达 50% 的性能提升。

    【讨论】:

    • 你可以使用@gt:img = bexfun( @gt, 1:n, (1:n).');
    • @Shai Ah gtlt 也可以。 bsxfun 有很多选择!! :)
    • bsxfun 继续给人留下深刻印象!总能找到一种巧妙的方式来使用它……而且当我想到它时它会更快是有道理的。一般来说,bsxfun 会更快(与大多数其他函数相比),因为没有创建中间数组。
    • @Divakar 你已经获得了我的 +1,但通过基准测试,答案会更好。你知道热身是如何工作的,或者为什么需要它?在我之前的基准测试中,我发现代码运行多次后运行速度更快。我总是把它归结为 JIT。但这种热身是另一回事,不是吗?
    • @Divakar 至于基准测试:公平地说,triu 解决方案应该是out2 = triu(true(n),1);,对吧?这在我的机器上似乎更快
    猜你喜欢
    • 2015-07-20
    • 2018-11-27
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多