将矩阵转换为二进制值

问题描述 投票:0回答:1

假设我有这个当前矩阵:

mat=[
    {'Blue'} {'Heavy'} {'Rounded'};
    {'White'} {'Light'} {'Square'};
    {'Green'} {'Light'} {'Rounded'};
    {'Blue'} {'Very Heavy'} {'Square'};
    {'White'} {'Light'} {'Rounded'};
    {'Green'} {'Very Heavy'} {'Square'};
    {'Blue'} {'Light'} {'Rounded'};
    {'White'} {'Very Heavy'} {'Square'};
    {'Green'} {'Very Heavy'} {'Rounded'};
    {'Blue'} {'Heavy'} {'Square'}];

首先,我需要创建矩阵的输出,如下所示:

     Color       Weight         Form 
       _______    ____________    _______

V1     'Blue'     'Heavy'         'Rounded' 
V2     'White'    'Light'         'Square'
V3     'Green'     'Light'         'Rounded' 
V4     'Blue'     'Very Heavy'    'Square'
V5     'White'    'Light'         'Rounded' 
V6     'Green'     'Very Heavy'    'Square'
V7     'Blue'     'Light'         'Rounded' 
V8     'White'    'Very Heavy'    'Square'
V9     'Green'     'Very Heavy'    'Rounded' 
V10    'Blue'     'Heavy'         'Square'

我想做的是将该矩阵中的元素转换为二进制值

即类似于此的内容:

codageVar =

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

例如,蓝色是{010},白色是{100},绿色是{001}如您所见,在这种情况下没有顺序感我们不能说蓝色>白色或蓝色

但是对于列权重=>重{010},轻{100},极重{001},应该有秩序感Very Heavy> Heavy> Light,这意味着应该将“非常沉重”编码为{111},它转换为7(111二进制= 7十进制)

我的目标是希望创建一个自动化程序,该程序可以将任何小矩阵作为输入,我希望这样做是希望的。然后问用户这些列中哪一列具有顺序感,然后将这些变量编码为二进制,例如它们在矩阵中排序]

例如:您在脚本中编写矩阵]

程序询问您:序号有几列?您回答即2然后程序询问您矩阵中这两列的位置是什么答案:即2和3然后问你这些值是多少回答,即非常重,轻便然后,它以二进制形式“编码”所有矩阵,但是如果矩阵总共有3列,则第1列将以二进制形式随机编码但是2和3中的元素应具有顺序(这并不意味着将矩阵从大到小重新排列,而只是二进制值)

我对Matlab还是很陌生,但这是我能想到的

clear all
clc
mat=[
    {'Bleu'} {'Lourd'} {'Rond'};
    {'Blanc'} {'Léger'} {'Carre'};
    {'Vert'} {'Léger'} {'Rond'};
    {'Bleu'} {'Très Lourd'} {'Carre'};
    {'Blanc'} {'Léger'} {'Rond'};
    {'Vert'} {'Très Lourd'} {'Carre'};
    {'Bleu'} {'Léger'} {'Rond'};
    {'Blanc'} {'Très Lourd'} {'Carre'};
    {'Vert'} {'Très Lourd'} {'Rond'};
    {'Bleu'} {'Lourd'} {'Carre'}];



NomCol = {'Couleur','Poids','Forme'};


for i=1:size(mat,1)
NomLignes{i}=['V' '' num2str(i)];
end

sTable = array2table(mat,'VariableNames',NomCol,'RowNames',NomLignes)


codage=[];
y=0;

for i=1:size(mat,2) 

    v=mat(:,i); 
    un=unique(v); 

    code=eye(size(un,1));

    codage2=[];

    for i=1:size(v,1)

        pos=strmatch(v(i,:),un);

        b=code(pos,:);

        codage2=[codage2;b];


    end
    codage=[codage,codage2];
end



codage

我可以用二进制编码所有变量而没有任何问题

codage =

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

我怎么需要重,非常重和轻的值才能对其具有序数意义,因此,非常重应该是= 1 1 1 /重= 1 1 0 /轻= 1 0 0,因为从逻辑上讲,非常重(7 in十进制)>重(十进制为6)

请让我知道我是否可以执行任何给定的改进功能或方法

假设我有这个当前矩阵:mat = [{'Blue'} {'Heavy'} {'Rounded'}; {'White'} {'Light'} {'Square'}; {'Green'} {'Light'} {'Rounded'}; {'Blue'} {'Very Heavy'} {'Square'}; {...

matlab matrix binary
1个回答
0
投票

转换矩阵很简单:

© www.soinside.com 2019 - 2024. All rights reserved.