基于Hadamard矩阵模式绘制8、16、32阶圆的技术实现请求
基于Hadamard矩阵的圆阵列绘制方案
我帮你把现有的N×N圆阵列代码修改成支持8/16/32阶Hadamard矩阵模式的版本,直接看代码和解释就行:
完整代码实现
% 绘制基于Hadamard矩阵模式的圆阵列 clc; clear; close all; % -------------------------- 参数配置 -------------------------- n_circles = 8; % Hadamard矩阵阶数(可选8/16/32,均为2的幂) R = 40; % 基础圆的半径 Len = 1024; % 画布尺寸(1024×1024) show_negative = false; % 是否显示Hadamard矩阵中-1对应的圆(false则只显示+1的位置) % ------------------------------------------------------------- % 生成对应阶数的Hadamard矩阵 H = hadamard(n_circles); if show_negative H = -H; % 反转显示逻辑,把-1的位置改成显示圆 end % 创建基础圆的掩码(标记圆内的点) M0 = zeros(2*R + 1); [x, y] = meshgrid(-R:R, -R:R); M0(x.^2 + y.^2 <= R^2) = 1; % 标记圆内的点为1 % 初始化画布掩码 M = zeros(Len); % 计算每个圆的中心间隔,保证阵列居中 spacing = Len / (n_circles + 1); centers = spacing : spacing : n_circles*spacing; % 遍历Hadamard矩阵,根据元素值绘制对应位置的圆 for i = 1:n_circles for j = 1:n_circles if H(i,j) == 1 % 计算当前圆在画布上的坐标范围 x_start = round(centers(j) - R); x_end = round(centers(j) + R); y_start = round(centers(i) - R); y_end = round(centers(i) + R); % 确保坐标不超出画布边界 x_start = max(x_start, 1); x_end = min(x_end, Len); y_start = max(y_start, 1); y_end = min(y_end, Len); % 截取基础圆掩码的对应区域,放到画布上 M(y_start:y_end, x_start:x_end) = M(y_start:y_end, x_start:x_end) | ... M0(y_start-(centers(i)-R)+1 : y_end-(centers(i)-R)+1, ... x_start-(centers(j)-R)+1 : x_end-(centers(j)-R)+1); end end end % 显示绘制结果 figure('Name', [num2str(n_circles) '阶Hadamard圆阵列']); imshow(M, []); colormap(gray); title([num2str(n_circles) '阶Hadamard矩阵模式圆阵列']);
关键部分解释
- Hadamard矩阵生成:Matlab内置的
hadamard(n)函数可以直接生成2的幂次阶数的Hadamard矩阵,正好匹配你需要的8/16/32阶。 - 显示逻辑控制:通过
show_negative参数可以切换显示模式——默认只显示矩阵中+1对应的圆,设为true则显示-1对应的圆。 - 居中排列:用
spacing = Len/(n_circles+1)计算每个圆的中心位置,让整个阵列在1024×1024的画布上均匀分布且居中。 - 边界处理:添加了坐标范围的判断,避免圆的边缘超出画布导致索引错误。
使用方法
只需要修改n_circles的值为8、16或32,运行代码就能得到对应阶数的Hadamard矩阵模式圆阵列啦。
内容的提问来源于stack exchange,提问作者Viron Gil A. Estrada
相关产品推荐
相关产品推荐

