for i=1:max_g sprintf('迭代次数%d',i) %分类 L1=zeros(1,size(P,1));%建立一个1行12列的数组 for j=1:size(P,1) d=zeros(1,k);%不同类簇的个数 for m=1:k d(m)=norm([P(j,:)-temp1a(m,:)]);%计算欧氏距离,norm表示范数,P(j,:)和temp1a(m,:)是两点坐标,差即为两点之间的距离向量,然后计算该向量的范数,即可得到欧几里得距离。 end [~,index]=min(d);%把欧式距离更新为当前的最小值 L1(j)=index; end LL1(i,:)=L1;%将L1向量赋值给LL1矩阵的第i行 temp2a=temp1a; for j=1:k T=find(L1==j);%j=3 L1中所有等于j的元素的下标放入T中储存 if size(T,2)~=0 temp2a(j,:)=sum(P(T,:))/size(T,2);%将P第T列的平均值,存储到temp2a矩阵的第j行中。 else temp2a(j,:)=[min_x+(max_x-min_x)*rand,min_y+(max_y-min_y)*rand];%生成二维随机坐标点。rand函数生成一个0到1之间的随机数,将其乘以对应轴的范围再加上最小值。 end end if i==1 temp1a=temp2a; %temp2a 赋值给 temp1a else if sum(sum(temp2a-temp1a))==0 %当 i>1时,判断temp2a和temp1a的差别是否为零,如果是,则跳出循环。第一个sum生成3*1矩阵,第二个sum生成一个数 break else temp1a=temp2a; %将temp2a赋值给temp1a end end end
时间: 2024-04-25 12:28:01 浏览: 74
这段代码是 K-means 聚类算法的实现,其中 max_g 是最大迭代次数,P 是数据集,k 是要聚成几类,temp1a 是初始的聚类中心点。在算法中,首先将数据集中每个点归到距离最近的聚类中心所在的类别中,然后根据每个类别中的数据点重新计算聚类中心点,直到聚类中心点不再变化或者达到最大迭代次数为止。最后,LL1 矩阵中的每一行表示每一次迭代后数据集中每个点所属的类别。
相关问题
% 指定包含SEM图像的目录 image_dir = 'D:\MATLAB\R2018a\bin\灰岩12个\样7\500X\'; % 从目录中读取图像文件名列表 image_files = dir(fullfile(image_dir, '*.tiff')); % K-均值聚类的参数 num_clusters = 3; % 簇数(可以更改此值) max_iterations = 100; % 最大迭代次数(可以更改此值) % 初始化矩阵以存储群集映像和群集中心 num_images = numel(image_files); % 计算图像文件数 clustered_images = cell(1, num_images); cluster_centers_all = cell(1, num_images); % 循环浏览每个图像文件 for i = 1:num_images % 读取当前图像并规范化 image_path = fullfile(image_dir, image_files(i).name); image_data = double(imread(image_path))/ 255; % 执行K-means聚类 [cluster_indices, cluster_centers] = kmeans(reshape(image_data,[],size(image_data,3)), num_clusters,'MaxIter',max_iterations); % 将聚集的数据重新整形为图像维度 clustered_images{i} = reshape(cluster_indices, size(image_data,1),size(image_data,2)); % 将聚类图像转换成彩色图像 RGB = zeros(size(image_data)); for j = 1:num_clusters RGB(:,:,j) = (clustered_images{i} == j); end RGB = bsxfun(@times, RGB, reshape(cluster_centers, 1,1,[])); clustered_images{i} = RGB; % 保存聚类后的图像到文件夹 [pathstr, name, ext] = fileparts(image_path); imwrite(uint8(RGB*255), fullfile(pathstr, [name '_clustered' ext])); end % 显示原始图像和群集图像 for i = 1:num_images figure; subplot(1, num_clusters + 1, 1); imshow(imread(fullfile(image_dir, image_files(i).name))); title('Original Image'); for j = 1:num_clusters subplot(1, num_clusters + 1, j + 1); imshow(clustered_images{i}); title(sprintf('Cluster %d', j)); end end % 计算孔隙率 porosity = zeros(1, num_images); for i = 1:num_images % 统计原始图像中的像素数 img_pixels = numel(imread(fullfile(image_dir, image_files(i).name))); % 统计聚类图像中标记为第一个簇的像素数 cluster_pixels = sum(sum(clustered_images{i}(:,:,1) > 0)); % 计算孔隙率 porosity(i)=(1 - (cluster_pixels / img_pixels))*100; end % 显示计算后的孔隙率 for i = 1:num_images fprintf('Image %d: Porosity = %f\n', i, porosity(i)); end
这是一段 MATLAB 代码,对一组 SEM 图像执行了 K-means 聚类,并计算了孔隙率。其中,通过指定包含 SEM 图像的目录,使用 `dir` 函数读取图像文件名列表,然后使用 `imread` 函数读取图像数据并规范化。接着,使用 `kmeans` 函数对图像进行 K-means 聚类,将聚类图像转换成彩色图像,并保存聚类后的图像到文件夹。最后,计算每个图像的孔隙率,并输出计算结果。
% 定义模拟的参数 n_mc = 3000; % 蒙特卡洛模拟的数量 n_pv = 10:10:100; % 要模拟的光伏渗透率水平阵列 mu = 10; % 概率电流的平均值 sigma = 2; % 概率电流的标准偏差 % 在光伏渗透水平上循环并运行模拟 for i = 1:length(n_pv) % 初始化数组以存储结果 I_pv = zeros(n_mc,1); % 存储光伏电流的数组 I_total = zeros(n_mc,1); % 存储总电流的数组。 % 循环进行蒙特卡罗模拟 parfor j = 1:n_mc % 产生随机的光伏电流 I_pv(j) = n_pv(i)*randn()*sigma + mu; % 生成随机的非光伏电流 I_nonpv = randn()*sigma + mu; % 计算总电流 I_total(j) = I_pv(j) + I_nonpv; end % 计算并绘制总电流的概率密度函数 figure(); histogram(I_total, 'Normalization', 'pdf'); hold on; [f, x] = ksdensity(I_total); plot(x,f,'LineWidth',2,'Color','r'); hold off; title(sprintf('PV Penetration = %d%%',n_pv(i))); xlabel('总电流(A)'); ylabel('概率密度'); legend('直方图','概率密度函数'); end
这段代码是用 MATLAB 编写的,用于模拟光伏电流和总电流的概率分布函数。具体来说,它使用蒙特卡罗模拟方法,对不同光伏渗透率水平下的总电流进行了模拟和分析。
代码中的参数包括:
- n_mc:蒙特卡洛模拟的数量,即模拟次数。
- n_pv:要模拟的光伏渗透率水平阵列。
- mu:概率电流的平均值。
- sigma:概率电流的标准偏差。
代码的主要部分是一个 for 循环,它在不同的光伏渗透率水平上循环并运行蒙特卡罗模拟。每次模拟中,它使用 randn() 函数生成随机的光伏电流和非光伏电流,并计算它们的总电流。最后,它使用 histogram() 和 ksdensity() 函数绘制总电流的概率密度函数。
需要注意的是,代码中使用了 parfor 循环,这是一个并行循环,可以加快代码的运行速度。
阅读全文