用c++或者matlab创立01矩阵,需要代码/ᐠ - ˕ -マ Ⳋ

怎么用c++或者matlab创建一个01矩阵,需要给每一行和每一列一个名称,如果行和列的名称相同数值为1,不相同为0,要求只输入n个行的名称(约10000个),列名称通过行名称的删除重复得到m个列名称(列名称是行名称的重复乱序排列),然后对比行名称和列名称,相同记为1,不同记为0,然后输出整个矩阵。

img

运行结果如下:

img

代码如下,行数多你可以把开头的代码修改为读取文件的方式:

% 输入行的名称
row_names = {'row1', 'row2', 'row3','row1', 'row2', 'row6','row3','row1', 'row2', 'row3','row1', 'row8','row1', 'row2','row2','row4','row5','row6','row3','row7'}; % 请用实际名称替换 ...

% 基于行名称删除重复并生成列名称
col_names = unique(row_names);
num_cols = numel(col_names);

% 初始化矩阵为全0矩阵
num_rows = numel(row_names);
matrix = zeros(num_rows, num_cols);

% 根据行名称和列名称,填充矩阵
for i = 1:num_rows
    for j = 1:num_cols
        if strcmp(row_names{i}, col_names{j})
            matrix(i, j) = 1;
        end
    end
end

% 显示矩阵
disp('Matrix:');
disp(matrix);

% 显示行和列的名称
disp('Row names:');
disp(row_names);

disp('Column names:');
disp(col_names);


该回答引用chatgpt:
创建01矩阵的示例代码,其中假设输入行名称的个数为n,每个名称的长度为10,以及每个行名称在列名称中最多出现10次(即m <= 10*n):

#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

int main() {
    int n;
    cout << "Enter the number of row names: ";
    cin >> n;

    vector<string> row_names(n);
    cout << "Enter the row names: " << endl;
    for (int i = 0; i < n; i++) {
        cin >> row_names[i];
    }

    int m = 10 * n; // Assume each row name can appear up to 10 times in column names
    vector<string> col_names(m);
    unordered_map<string, int> row_map; // Maps row names to row indices
    unordered_map<string, int> col_map; // Maps column names to column indices

    // Generate column names by shuffling and repeating row names
    for (int i = 0; i < n; i++) {
        string row_name = row_names[i];
        for (int j = 0; j < 10; j++) {
            string col_name = row_name + "_" + to_string(j);
            col_names[10 * i + j] = col_name;
        }
    }

    // Assign indices to row and column names
    for (int i = 0; i < n; i++) {
        string row_name = row_names[i];
        row_map[row_name] = i;
        for (int j = 0; j < 10; j++) {
            string col_name = col_names[10 * i + j];
            col_map[col_name] = 10 * i + j;
        }
    }

    // Initialize matrix to all zeros
    vector<vector<int>> matrix(n, vector<int>(m, 0));

    // Fill in matrix with ones where row and column names match
    for (int i = 0; i < n; i++) {
        string row_name = row_names[i];
        for (int j = 0; j < 10; j++) {
            string col_name = col_names[10 * i + j];
            if (row_name == col_name) {
                matrix[i][10 * i + j] = 1;
            }
        }
    }

    // Output matrix with row and column names
    cout << "\t";
    for (int j = 0; j < m; j++) {
        cout << col_names[j] << "\t";
    }
    cout << endl;
    for (int i = 0; i < n; i++) {
        cout << row_names[i] << "\t";
        for (int j = 0; j < m; j++) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}


以下是使用Matlab创建01矩阵的示例代码,其中假设输入行名称的个数为n,每个名称的长度为10,以及每个行名称在列名称中最多出现10次(即m <= 10*n):

n = input('Enter the number of row names: ');
row_names = cell(n, 1);
for i = 1:n
    row_names{i} = input('Enter a row name: ', 's');
end

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是使用 C++ 实现的代码示例:

#include <iostream>
#include <unordered_set>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    int n; // 行数
    cin >> n;
    vector<string> row_names(n); // 行名称数组
    for (int i = 0; i < n; i++) {
        cin >> row_names[i];
    }

    // 列名称数组,通过去重得到
    unordered_set<string> col_names_set(row_names.begin(), row_names.end());
    vector<string> col_names(col_names_set.begin(), col_names_set.end());
    sort(col_names.begin(), col_names.end()); // 排序

    int m = col_names.size(); // 列数
    vector<vector<int>> matrix(n, vector<int>(m)); // 01矩阵

    // 生成01矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (row_names[i] == col_names[j]) {
                matrix[i][j] = 1;
            } else {
                matrix[i][j] = 0;
            }
        }
    }

    // 输出矩阵
    cout << "\t"; // 输出列名称的占位符
    for (int j = 0; j < m; j++) {
        cout << col_names[j] << "\t";
    }
    cout << endl;
    for (int i = 0; i < n; i++) {
        cout << row_names[i] << "\t";
        for (int j = 0; j < m; j++) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}

这个程序首先读入行名称,然后通过去重得到列名称,生成一个 01 矩阵,最后输出整个矩阵,其中行名称和列名称都被打印出来。

以下是使用 MATLAB 实现的代码示例:

n = input('请输入行数:');
row_names = cell(n, 1); % 行名称数组
for i = 1:n
    row_names{i} = input('请输入行名称:', 's');
end

% 列名称数组,通过去重得到
col_names = unique(row_names);
col_names = sort(col_names); % 排序

m = length(col_names); % 列数
matrix = zeros(n, m); % 01矩阵

% 生成01矩阵
for i = 1:n
    for j = 1:m
        if strcmp(row_names{i}, col_names{j})
            matrix(i, j) = 1;
        else
            matrix(i, j) = 0;
        end
    end
end

% 输出矩阵
fprintf('\t'); % 输出列名称的占位符
for j = 1:m
    fprintf('%s\t', col_names{j});
end
fprintf('\n');
for i = 1:n
    fprintf('%s\t', row_names{i});
    for j = 1:m
        fprintf('%d\t', matrix(i, j));
    end
    fprintf('\n');
end

这个程序首先读入行名称,然后通过去重得到列名称,生成一个 01 矩阵,最后输出整个矩阵,其中行名称和列名称都被打印出来。需要注意的是,MATLAB 中的字符串比较需要使用 strcmp 函数。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢


#include <iostream>
#include <vector>

int main() {
    int rows, cols;
    std::cout << "请输入矩阵的行数:";
    std::cin >> rows;
    std::cout << "请输入矩阵的列数:";
    std::cin >> cols;

    std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols, 0)); // 初始化为全 0 的二维矩阵

    // 遍历矩阵,并在每个位置随机赋值为 0 或 1
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = rand() % 2;
        }
    }

    // 输出矩阵
    std::cout << "生成的矩阵为:" << std::endl;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

c++求矩阵的秩_Matlab:矩阵的创建及其行列式

可以借鉴下
https://blog.csdn.net/weixin_39622289/article/details/110265123

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7756689
  • 除此之外, 这篇博客: 《信号与系统》 实验一 信号的时域分析及Matlab实现中的 题目1代码实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • syms t;
    f=sym('sin(t)/t'); %定义符号函数 f(t)=sin(t)/t
    f1=subs(f,t,(-3)*t+5); %对 f 进行移位
    subplot(2,1,1);ezplot(f,[-8,8]);grid on;% ezplot 是符号函数绘图命令
    subplot(2,1,2);ezplot(f1,[-8,8,-0.3,1.1]);grid on;
    

    运行结果
    在这里插入图片描述

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
C++实现:

#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    int n;
    cout << "请输入行数n:";
    cin >> n;
    map<string, int> rowMap; // 行名称映射
    vector<string> colVec; // 列名称向量
    string name;
    for (int i = 0; i < n; i++) {
        cout << "请输入第" << i+1 << "行的名称:";
        cin >> name;
        rowMap[name] = i; // 将行名称转换为行号,方便后面构造矩阵
        colVec.push_back(name); // 列名称为行名称的乱序排列,向列名称向量添加行名称
    }

    // 构造01矩阵
    int m = colVec.size(); // 列数为列名称向量中字符串的数目
    int mat[n][m];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (colVec[j] == rowMap.begin()->first) {
                mat[i][j] = 1;
            } else {
                mat[i][j] = 0;
            }
        }
        rowMap.erase(rowMap.begin()); // 从行名称映射表中删除已经处理的行名称
    }

    // 输出矩阵
    cout << "矩阵如下:" << endl;
    cout << "\t";
    for (int j = 0; j < m; j++) {
        cout << colVec[j] << "\t";
    }
    cout << endl;
    for (int i = 0; i < n; i++) {
        cout << rowMap.size() + i + 1 << "\t";
        for (int j = 0; j < m; j++) {
            cout << mat[i][j] << "\t";
        }
        cout << endl;
    }
    return 0;
}

Matlab实现:

n = input('请输入行数n:');
rowMap = containers.Map('KeyType', 'char', 'ValueType', 'int32');
colVec = {}; % 列名称向量
for i = 1:n
    name = input(['请输入第', num2str(i), '行的名称:'], 's');
    rowMap(name) = i; % 将行名称映射为行号
    colVec{end+1} = name; % 列名称就是行名称的乱序排列,加到列名称向量末尾
end
m = numel(colVec); % 列数为列名称向量中元素的个数
mat = zeros(n, m); % 创建全0矩阵
for i = 1:n
    for j = 1:m
        if strcmp(colVec{j}, keys(rowMap{1}))
            mat(i,j) = 1;
        end
    end
    rowMap(remove(rayMap, keys(rowMap{1}))) = []; % 从行名称映射表中删除已经处理的行名称
end

% 输出矩阵
fprintf('矩阵如下:\n');
fprintf('\t');
for j = 1:m
    fprintf('%s\t', colVec{j});
end
fprintf('\n');
for i = 1:n
    fprintf('%d\t', numel(keys(rowMap)) + i);
    for j = 1:m
        fprintf('%d\t', mat(i,j));
    end
    fprintf('\n');
end

如果我的回答解决了您的问题,请采纳!