【问题标题】:Finding a critical point in matrix在矩阵中找到一个临界点
【发布时间】:2015-05-27 00:49:09
【问题描述】:

我试图在矩阵中找到一个临界点。索引 (i,j) 处的值应大于或等于其行中的所有元素,并且小于或等于其列中的所有元素。

这是我所拥有的(它已关闭但我很接近):

function C = critical(A)
[nrow ncol] = size(A);
C = [];
for i = 1:nrow
    for j = 1:ncol
        if (A(i,j) >= A(i,1:end)) && (A(i,j) <= A(1:end,j))
            C = [C ; A(i,j)]
        end
    end
end

【问题讨论】:

  • 你的A矩阵有多大?
  • 我的意思是它可能非常大。这是个问题吗?

标签: matlab function for-loop matrix indexing


【解决方案1】:

您可以使用逻辑索引。

minI = min(A,[],1);
maxI = max(A,[],2);
[row,col] = find(((A.'==maxI.').' & A==minI) ==1)

详情

请记住,Matlab 是列专业的。因此,我们转置 A 和 maxI。

A = [

   3   4   1   1   2
   2   4   2   1   4
   4   3   2   1   2
   3   3   1   1   1
   2   3   0   2   1];

A.'==maxI.'
ans =

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

然后做最小化

A==minI
ans =

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

然后将两者相乘

((A.'==maxI.').' & A==minI)
ans =

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

然后找到行和列

[row,col] = find(((A.'==maxI.').' & A==minI) ==1)

row =

   4
   5

col =

   2
   2

【讨论】:

    【解决方案2】:

    使用bsxfun试试这个矢量化解决方案

    function [ r,c,criP ] = critical( A )
    
        %// finding the min and max values of each col & row resptly
        minI = min(A,[],1);
        maxI = max(A,[],2);
    
        %// matching all the values of min & max for each col and row resptly 
        %// getting the indexes of the elements satisfying both the conditions
        idx = find(bsxfun(@eq,A,maxI) & bsxfun(@eq,A,minI));
    
        %// getting the corresponding values from the indexes
        criP = A(idx);
    
        %// Also getting corresponding row and col sub
        [r,c] = ind2sub(size(A),idx);
    end
    

    示例运行:

    r,c 应该是一个等长的向量,表示每个临界点的行和列子。而val 是一个相同长度的向量,给出了临界点本身的值

    >> A
    
    A =
    
     3     4     1     1     2
     2     4     2     1     4
     4     3     2     1     2
     3     3     1     1     1
     2     3     0     2     1
    
    
    >> [r,c,val] = critical(A)
    
    r =
    
     4
     5
    
    c =
    
     2
     2
    
    val =
    
     3
     3
    

    【讨论】:

    • 您可以使用[I,J]=ind2sub(size(A),find(C)A(I,J) 来获取关键点的行/列索引和值。
    • @David,因此函数 [I,J]=ind2sub(size(A),find(C)) 将找到行/列索引和临界点的值。那存储在哪里?在 I 和 J 中?
    • 当我运行我的函数时,很关键,我没有得到正确的结果。我的第一行是“function [rs] = critical(A)”。我不确定出了什么问题
    • 是的,那太好了。我的功能再次不起作用。我想知道我的 Matlab 试用版是否存在 bsxfun 问题。
    • @statsguyz 添加了 cmets 以澄清......你的功能现在工作了吗?
    【解决方案3】:

    我认为intersect 有一个更简单的方法:

    >> [~, row, col] = intersect(max(A,[],2), min(A));
    row =
    
     4
    
    
    col =
    
     2
    

    更新:

    intersect,如果你有多个临界点,它只会给你第一个。要拥有所有的指标,还有另一种简单的方法:

    >> B
    
    B =
    
     3     4     1     4     2     5
     2     5     2     4     4     4
     4     4     2     4     2     4
     3     4     1     4     1     4
     2     5     4     4     4     5
    
    >> row = find(ismember(max(B,[],2),min(B)))
    
    row =
    
     3
     4
    
    >> col = find(ismember(min(B),max(B,[],2)))
    
    col =
    
     2     4     6
    

    请注意,现在的临界点集应该是rowcol 的组合,这意味着在此示例中您总共有6 个临界点:(3,2),(4,2),(3,4),(4,4),(3,6),(4,6)

    Here你可以找到如何导出这样的组合。

    【讨论】:

    • 很好..那么你必须使用combvec 然后sub2ind 然后B(ind) 来获取值?
    • 不,使用meshgrid[p q] = meshgrid(row, col); indicies = [p(:) q(:)];。它是一个内置函数。您需要combvec 的神经网络工具箱。
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多