基于小波框架与稀疏表示的SAR图像目标识别系统(MATLAB实现)

一、系统架构与核心算法

1.1 系统流程图

复制代码
SAR原始图像 → 小波去噪 → 多尺度小波分解 → 特征提取 → 字典学习 → 稀疏编码 → 分类识别
     ↓           ↓           ↓              ↓          ↓          ↓          ↓
  预处理     db4/sym8   近似+细节系数   统计特征    K-SVD     OMP算法   最小残差

1.2 核心算法模块

matlab 复制代码
%% 主程序:SAR目标识别系统
clear; clc; close all;

%% 1. 参数配置
config.wavelet = 'sym8';      % 小波基(对称小波适合SAR边缘)
config.level = 4;             % 分解层数
config.dict_size = 256;       % 字典原子数
config.sparsity = 10;         % 稀疏度(非零系数个数)
config.patch_size = 32;       % 图像块大小
config.stride = 16;           % 滑动步长
config.noise_std = 0.05;      % 噪声标准差(模拟相干斑)

%% 2. 加载数据(这里使用模拟数据,实际应替换为MSTAR数据集)
fprintf('=== 加载SAR图像数据 ===\n');
[data_train, labels_train, data_test, labels_test] = load_sar_data();

%% 3. 预处理与小波特征提取
fprintf('=== 预处理与小波特征提取 ===\n');
train_features = extract_wavelet_features(data_train, config);
test_features = extract_wavelet_features(data_test, config);

%% 4. 字典学习
fprintf('=== 字典学习 ===\n');
dictionary = train_dictionary(train_features, config);

%% 5. 稀疏表示分类
fprintf('=== 稀疏表示分类 ===\n');
predictions = classify_sparse_representation(test_features, dictionary, train_features, labels_train, config);

%% 6. 性能评估
fprintf('=== 性能评估 ===\n');
evaluate_performance(predictions, labels_test);

二、关键函数实现

2.1 SAR数据加载与预处理

matlab 复制代码
function [data_train, labels_train, data_test, labels_test] = load_sar_data()
    % 模拟MSTAR数据集:10类地面军事目标
    % 实际使用时替换为真实数据路径
    
    num_classes = 10;
    samples_per_class_train = 100;
    samples_per_class_test = 30;
    img_size = [128, 128];
    
    % 类别名称(MSTAR数据集)
    class_names = {'2S1', 'BMP2', 'BRDM2', 'BTR60', 'BTR70', ...
                   'D7', 'T62', 'T72', 'ZIL131', 'ZSU234'};
    
    % 初始化存储
    data_train = cell(num_classes * samples_per_class_train, 1);
    labels_train = zeros(num_classes * samples_per_class_train, 1);
    data_test = cell(num_classes * samples_per_class_test, 1);
    labels_test = zeros(num_classes * samples_per_class_test, 1);
    
    % 生成模拟数据(实际应从文件读取)
    idx_train = 1;
    idx_test = 1;
    
    for class_id = 1:num_classes
        fprintf('生成类别 %s 数据...\n', class_names{class_id});
        
        % 训练样本
        for sample = 1:samples_per_class_train
            % 模拟SAR图像(包含目标和背景)
            img = generate_sar_image(class_id, img_size);
            data_train{idx_train} = img;
            labels_train(idx_train) = class_id;
            idx_train = idx_train + 1;
        end
        
        % 测试样本
        for sample = 1:samples_per_class_test
            img = generate_sar_image(class_id, img_size);
            data_test{idx_test} = img;
            labels_test(idx_test) = class_id;
            idx_test = idx_test + 1;
        end
    end
    
    fprintf('数据加载完成:训练集 %d 个,测试集 %d 个\n', ...
            length(data_train), length(data_test));
end

function img = generate_sar_image(class_id, img_size)
    % 生成模拟SAR图像
    [rows, cols] = deal(img_size(1), img_size(2));
    img = zeros(rows, cols);
    
    % 添加背景(模拟地面杂波)
    background = 0.1 * randn(rows, cols);
    
    % 添加目标(不同类别有不同形状和位置)
    target_size = 20 + class_id * 2;  % 目标大小随类别变化
    center_x = randi([target_size, rows-target_size]);
    center_y = randi([target_size, cols-target_size]);
    
    % 创建目标区域(矩形或圆形)
    if mod(class_id, 2) == 0
        % 矩形目标
        img(center_x-target_size/2:center_x+target_size/2, ...
            center_y-target_size/2:center_y+target_size/2) = 1;
    else
        % 圆形目标
        [X, Y] = meshgrid(1:cols, 1:rows);
        mask = (X-center_y).^2 + (Y-center_x).^2 <= (target_size/2)^2;
        img(mask) = 1;
    end
    
    % 添加相干斑噪声(乘性噪声)
    speckle = exp(0.5 * randn(rows, cols));
    img = (img + background) .* speckle;
    
    % 归一化
    img = (img - min(img(:))) / (max(img(:)) - min(img(:)));
end

2.2 小波去噪与特征提取

matlab 复制代码
function features = extract_wavelet_features(data, config)
    % 提取小波特征
    % data: 细胞数组,每个元素是一幅SAR图像
    % config: 配置参数
    
    num_samples = length(data);
    features = cell(num_samples, 1);
    
    parfor i = 1:num_samples  % 并行处理加速
        fprintf('处理第 %d/%d 个样本...\n', i, num_samples);
        
        % 获取图像
        img = data{i};
        
        % 1. 小波去噪
        denoised_img = wavelet_denoising(img, config.wavelet, config.level);
        
        % 2. 多尺度小波分解
        [coeffs, sizes] = wavedec2(denoised_img, config.level, config.wavelet);
        
        % 3. 提取统计特征
        feat_vector = [];
        
        % 近似系数特征(低频)
        approx_coeff = appcoef2(coeffs, sizes, config.wavelet, config.level);
        feat_vector = [feat_vector; extract_stats(approx_coeff)];
        
        % 细节系数特征(高频)
        for level = 1:config.level
            [horiz, vert, diag] = detcoef2('all', coeffs, sizes, level);
            
            % 水平细节
            feat_vector = [feat_vector; extract_stats(horiz)];
            % 垂直细节
            feat_vector = [feat_vector; extract_stats(vert)];
            % 对角细节
            feat_vector = [feat_vector; extract_stats(diag)];
            
            % 能量特征
            feat_vector = [feat_vector; sum(horiz(:).^2)];
            feat_vector = [feat_vector; sum(vert(:).^2)];
            feat_vector = [feat_vector; sum(diag(:).^2)];
        end
        
        % 4. 纹理特征(灰度共生矩阵)
        texture_feats = extract_glcm_features(approx_coeff);
        feat_vector = [feat_vector; texture_feats];
        
        features{i} = feat_vector;
    end
    
    % 转换为矩阵形式
    features = cell2mat(features);
end

function denoised_img = wavelet_denoising(img, wavelet, level)
    % 小波阈值去噪
    % 使用软阈值去噪,保留边缘信息
    
    % 小波分解
    [coeffs, sizes] = wavedec2(img, level, wavelet);
    
    % 计算阈值(基于中值绝对偏差)
    detail_coeffs = coeffs(1:prod(sizes(1,:)));  % 第一个细节系数
    threshold = median(abs(detail_coeffs)) / 0.6745;
    
    % 软阈值处理
    coeffs_thresh = wthresh(coeffs, 's', threshold);
    
    % 重构
    denoised_img = waverec2(coeffs_thresh, sizes, wavelet);
end

function stats = extract_stats(coeff_block)
    % 提取统计特征
    stats = [
        mean(coeff_block(:));      % 均值
        std(coeff_block(:));       % 标准差
        median(coeff_block(:));    % 中位数
        max(coeff_block(:));       % 最大值
        min(coeff_block(:));       % 最小值
        iqr(coeff_block(:));       % 四分位距
        sum(coeff_block(:).^2)     % 能量
    ];
end

function texture_feats = extract_glcm_features(img)
    % 提取灰度共生矩阵纹理特征
    % 将图像量化为8级灰度
    img_quant = uint8(img * 7) + 1;
    
    % 计算灰度共生矩阵(4个方向)
    offsets = [0 1; -1 1; -1 0; -1 -1];
    glcm = graycomatrix(img_quant, 'Offset', offsets);
    
    % 提取纹理特征
    props = {'Contrast', 'Correlation', 'Energy', 'Homogeneity'};
    texture_feats = graycoprops(glcm, props);
    
    % 转换为行向量
    texture_feats = [texture_feats.Contrast(:)', ...
                    texture_feats.Correlation(:)', ...
                    texture_feats.Energy(:)', ...
                    texture_feats.Homogeneity(:)'];
end

2.3 K-SVD字典学习

matlab 复制代码
function dictionary = train_dictionary(features, config)
    % 使用K-SVD算法训练字典
    % features: 特征矩阵 (特征维度 × 样本数)
    % config: 配置参数
    
    fprintf('开始K-SVD字典学习...\n');
    
    % 参数设置
    patch_size = config.patch_size;
    stride = config.stride;
    dict_size = config.dict_size;
    
    % 将特征重塑为图像块
    [~, num_samples] = size(features);
    patches = [];
    
    for i = 1:num_samples
        % 将特征向量重塑为图像
        feat_dim = sqrt(size(features, 1));
        if mod(feat_dim, 1) == 0
            feat_img = reshape(features(:, i), feat_dim, feat_dim);
        else
            % 如果不是完全平方数,填充为正方形
            feat_img = imresize(reshape(features(:, i), [], 1), [patch_size, patch_size]);
        end
        
        % 提取图像块
        [rows, cols] = size(feat_img);
        for r = 1:stride:rows-patch_size+1
            for c = 1:stride:cols-patch_size+1
                patch = feat_img(r:r+patch_size-1, c:c+patch_size-1);
                patches = [patches, patch(:)];
            end
        end
    end
    
    % K-SVD字典学习
    dictionary = ksvd(patches, dict_size, 'maxIter', 50, 'sparsity', config.sparsity);
    
    fprintf('字典学习完成,字典大小: %d × %d\n', size(dictionary));
end

function dictionary = ksvd(data, dict_size, varargin)
    % K-SVD字典学习算法简化实现
    % 实际使用时建议使用成熟的K-SVD工具箱
    
    % 参数解析
    p = inputParser;
    addParameter(p, 'maxIter', 50, @isnumeric);
    addParameter(p, 'sparsity', 10, @isnumeric);
    parse(p, varargin{:});
    
    maxIter = p.Results.maxIter;
    sparsity = p.Results.sparsity;
    
    [dim, num_patches] = size(data);
    
    % 初始化字典(使用数据样本)
    dictionary = data(:, randperm(num_patches, dict_size));
    
    % K-SVD迭代
    for iter = 1:maxIter
        fprintf('K-SVD迭代 %d/%d\n', iter, maxIter);
        
        % 稀疏编码(使用OMP)
        sparse_codes = omp(dictionary, data, sparsity);
        
        % 更新字典原子
        for atom_idx = 1:dict_size
            % 找到使用该原子的样本
            usage = sparse_codes(atom_idx, :) ~= 0;
            if sum(usage) < 1
                continue;
            end
            
            % 计算误差矩阵
            error_matrix = data(:, usage) - dictionary * sparse_codes(:, usage);
            
            % SVD分解
            [U, S, V] = svds(error_matrix, 1);
            
            % 更新原子
            dictionary(:, atom_idx) = U;
            
            % 更新稀疏系数
            sparse_codes(atom_idx, usage) = S * V';
        end
    end
end

function sparse_codes = omp(dictionary, signals, sparsity)
    % 正交匹配追踪(OMP)稀疏编码
    [dict_size, ~] = size(dictionary);
    [~, num_signals] = size(signals);
    
    sparse_codes = zeros(dict_size, num_signals);
    
    for i = 1:num_signals
        signal = signals(:, i);
        residual = signal;
        support = [];
        
        for iter = 1:sparsity
            % 计算相关性
            correlations = abs(dictionary' * residual);
            
            % 选择最相关的原子
            [~, idx] = max(correlations);
            support = union(support, idx);
            
            % 最小二乘求解
            dict_support = dictionary(:, support);
            coeffs = dict_support \ signal;
            
            % 更新残差
            residual = signal - dict_support * coeffs;
            
            % 检查收敛
            if norm(residual) < 1e-6
                break;
            end
        end
        
        % 保存稀疏系数
        sparse_codes(support, i) = coeffs;
    end
end

2.4 稀疏表示分类器

matlab 复制代码
function predictions = classify_sparse_representation(test_features, dictionary, train_features, labels_train, config)
    % 基于稀疏表示的分类
    % 使用最小重构误差准则
    
    num_test = size(test_features, 2);
    num_classes = max(labels_train);
    predictions = zeros(num_test, 1);
    
    % 为每个类别构建子字典
    class_dictionaries = cell(num_classes, 1);
    for class_id = 1:num_classes
        class_mask = (labels_train == class_id);
        class_features = train_features(:, class_mask);
        class_dictionaries{class_id} = class_features;
    end
    
    % 对每个测试样本进行分类
    parfor i = 1:num_test
        fprintf('分类第 %d/%d 个测试样本...\n', i, num_test);
        
        test_sample = test_features(:, i);
        residuals = zeros(num_classes, 1);
        
        % 计算每个类别的重构误差
        for class_id = 1:num_classes
            % 获取该类的字典
            class_dict = class_dictionaries{class_id};
            
            % 稀疏编码
            sparse_code = omp(class_dict, test_sample, config.sparsity);
            
            % 重构并计算误差
            reconstructed = class_dict * sparse_code;
            residuals(class_id) = norm(test_sample - reconstructed);
        end
        
        % 选择最小误差的类别
        [~, predicted_class] = min(residuals);
        predictions(i) = predicted_class;
    end
end

2.5 性能评估

matlab 复制代码
function evaluate_performance(predictions, labels_test)
    % 评估分类性能
    
    % 计算准确率
    accuracy = mean(predictions == labels_test) * 100;
    
    % 混淆矩阵
    num_classes = max(labels_test);
    conf_mat = zeros(num_classes, num_classes);
    
    for i = 1:length(labels_test)
        true_label = labels_test(i);
        pred_label = predictions(i);
        conf_mat(true_label, pred_label) = conf_mat(true_label, pred_label) + 1;
    end
    
    % 计算每个类别的精确率和召回率
    precision = zeros(num_classes, 1);
    recall = zeros(num_classes, 1);
    f1_score = zeros(num_classes, 1);
    
    for i = 1:num_classes
        TP = conf_mat(i, i);
        FP = sum(conf_mat(:, i)) - TP;
        FN = sum(conf_mat(i, :)) - TP;
        
        precision(i) = TP / (TP + FP + eps) * 100;
        recall(i) = TP / (TP + FN + eps) * 100;
        f1_score(i) = 2 * precision(i) * recall(i) / (precision(i) + recall(i) + eps);
    end
    
    % 显示结果
    fprintf('\n========== 性能评估结果 ==========\n');
    fprintf('总体准确率: %.2f%%\n\n', accuracy);
    
    fprintf('各类别性能:\n');
    fprintf('%-10s %-10s %-10s %-10s\n', '类别', '精确率', '召回率', 'F1分数');
    fprintf('%-10s %-10s %-10s %-10s\n', '----', '------', '------', '------');
    
    class_names = {'2S1', 'BMP2', 'BRDM2', 'BTR60', 'BTR70', ...
                   'D7', 'T62', 'T72', 'ZIL131', 'ZSU234'};
    
    for i = 1:num_classes
        fprintf('%-10s %-9.1f%% %-9.1f%% %-9.1f%%\n', ...
                class_names{i}, precision(i), recall(i), f1_score(i));
    end
    
    % 绘制混淆矩阵
    figure('Position', [100, 100, 800, 600]);
    imagesc(conf_mat);
    colormap(jet);
    colorbar;
    xlabel('预测标签');
    ylabel('真实标签');
    title(sprintf('混淆矩阵 (准确率: %.2f%%)', accuracy));
    
    % 设置坐标轴标签
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', class_names);
    set(gca, 'YTick', 1:num_classes, 'YTickLabel', class_names);
    xtickangle(45);
    
    % 添加数值标注
    for i = 1:num_classes
        for j = 1:num_classes
            text(j, i, num2str(conf_mat(i, j)), ...
                 'HorizontalAlignment', 'center', ...
                 'VerticalAlignment', 'middle', ...
                 'Color', 'white', 'FontWeight', 'bold');
        end
    end
    
    % 绘制性能柱状图
    figure('Position', [100, 100, 1200, 400]);
    
    subplot(1,3,1);
    bar(1:num_classes, precision);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', class_names);
    ylabel('精确率 (%)');
    title('各类别精确率');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
    
    subplot(1,3,2);
    bar(1:num_classes, recall);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', class_names);
    ylabel('召回率 (%)');
    title('各类别召回率');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
    
    subplot(1,3,3);
    bar(1:num_classes, f1_score);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', class_names);
    ylabel('F1分数 (%)');
    title('各类别F1分数');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
end

三、实验验证与结果分析

3.1 抗噪性能测试

matlab 复制代码
function noise_robustness_test()
    % 抗噪性能测试
    fprintf('=== 抗噪性能测试 ===\n');
    
    % 加载数据
    [~, labels_train, data_test, labels_test] = load_sar_data();
    
    % 配置参数
    config.wavelet = 'sym8';
    config.level = 4;
    config.dict_size = 256;
    config.sparsity = 10;
    
    % 提取特征
    train_features = extract_wavelet_features(data_train, config);
    
    % 不同噪声水平测试
    noise_levels = [0, 0.05, 0.1, 0.2, 0.3];
    accuracies = zeros(length(noise_levels), 1);
    
    for i = 1:length(noise_levels)
        fprintf('测试噪声水平: %.2f\n', noise_levels(i));
        
        % 添加噪声
        noisy_test = cellfun(@(x) x + noise_levels(i) * randn(size(x)), ...
                           data_test, 'UniformOutput', false);
        
        % 提取特征
        test_features = extract_wavelet_features(noisy_test, config);
        
        % 训练字典
        dictionary = train_dictionary(train_features, config);
        
        % 分类
        predictions = classify_sparse_representation(test_features, dictionary, ...
                                                    train_features, labels_train, config);
        
        % 计算准确率
        accuracies(i) = mean(predictions == labels_test) * 100;
        fprintf('准确率: %.2f%%\n', accuracies(i));
    end
    
    % 绘制抗噪曲线
    figure('Position', [100, 100, 800, 600]);
    plot(noise_levels, accuracies, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
    xlabel('噪声水平');
    ylabel('识别准确率 (%)');
    title('小波+稀疏表示方法的抗噪性能');
    grid on;
    ylim([0, 100]);
    
    % 添加数值标注
    for i = 1:length(noise_levels)
        text(noise_levels(i), accuracies(i), sprintf('%.1f%%', accuracies(i)), ...
             'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
    end
end

3.2 与传统方法对比

matlab 复制代码
function comparative_study()
    % 与传统方法对比
    fprintf('=== 与传统方法对比 ===\n');
    
    % 加载数据
    [data_train, labels_train, data_test, labels_test] = load_sar_data();
    
    % 配置
    config.wavelet = 'sym8';
    config.level = 4;
    config.dict_size = 256;
    config.sparsity = 10;
    
    % 方法1:PCA+SVM
    fprintf('方法1: PCA + SVM...\n');
    % 将图像展平为特征向量
    train_vec = cellfun(@(x) x(:), data_train, 'UniformOutput', false);
    train_vec = cell2mat(train_vec')';
    test_vec = cellfun(@(x) x(:), data_test, 'UniformOutput', false);
    test_vec = cell2mat(test_vec')';
    
    % PCA降维
    [coeff, score_train] = pca(train_vec, 'NumComponents', 100);
    score_test = test_vec * coeff;
    
    % SVM分类
    svm_model = fitcecoc(score_train, labels_train, 'Learners', 'svm');
    svm_pred = predict(svm_model, score_test);
    svm_acc = mean(svm_pred == labels_test) * 100;
    
    % 方法2:小波+SVM
    fprintf('方法2: 小波 + SVM...\n');
    train_features = extract_wavelet_features(data_train, config);
    test_features = extract_wavelet_features(data_test, config);
    
    svm_model2 = fitcecoc(train_features', labels_train, 'Learners', 'svm');
    svm_pred2 = predict(svm_model2, test_features');
    svm_acc2 = mean(svm_pred2 == labels_test) * 100;
    
    % 方法3:小波+稀疏表示(本文方法)
    fprintf('方法3: 小波 + 稀疏表示...\n');
    dictionary = train_dictionary(train_features, config);
    sparse_pred = classify_sparse_representation(test_features, dictionary, ...
                                                 train_features, labels_train, config);
    sparse_acc = mean(sparse_pred == labels_test) * 100;
    
    % 结果对比
    methods = {'PCA+SVM', '小波+SVM', '小波+稀疏表示'};
    accuracies = [svm_acc, svm_acc2, sparse_acc];
    
    % 可视化对比
    figure('Position', [100, 100, 1000, 600]);
    bar(accuracies);
    set(gca, 'XTick', 1:3, 'XTickLabel', methods);
    ylabel('识别准确率 (%)');
    title('不同方法性能对比');
    ylim([0, 100]);
    grid on;
    
    % 添加数值标注
    for i = 1:3
        text(i, accuracies(i), sprintf('%.1f%%', accuracies(i)), ...
             'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom', ...
             'FontWeight', 'bold');
    end
    
    fprintf('\n========== 对比结果 ==========\n');
    for i = 1:3
        fprintf('%s: %.2f%%\n', methods{i}, accuracies(i));
    end
end

参考代码 使用小波框架并结合稀疏表示,用于SAR图像的目标识别应用 www.youwenfan.com/contentcsv/79142.html

四、实际应用建议

4.1 参数调优指南

参数 推荐值 调优建议
小波基 sym8, db4 对称小波适合SAR边缘,db4计算快
分解层数 3-5层 图像越大层数越多,128×128用4层
字典大小 256-512 样本少选小值,样本多选大值
稀疏度 5-15 特征维度高选大值,低选小值
图像块大小 16×16, 32×32 目标大选大块,小选小块

4.2 工程优化技巧

  1. 内存优化:使用稀疏矩阵存储特征,避免全矩阵
  2. 并行计算 :使用parfor加速特征提取和分类
  3. 增量学习:对新样本更新字典,适应新目标
  4. 多尺度融合:融合不同尺度小波特征提升鲁棒性

4.3 常见问题解决

问题 解决方案
过拟合 增加正则化、减少字典大小、使用Dropout
计算量大 使用近似K-SVD、随机投影降维
小样本 数据增强(旋转、缩放、加噪)、迁移学习
复杂背景 加入背景抑制、使用注意力机制

4.4 扩展应用方向

  1. 多源数据融合:结合光学、红外等多模态数据
  2. 变化检测:利用时间序列SAR图像进行目标变化分析
  3. 目标检测:扩展到滑动窗口检测框架
  4. 实时系统:移植到GPU,实现实时目标识别

五、总结

本MATLAB实现提供了一个完整的基于小波框架与稀疏表示的SAR图像目标识别系统。系统特点:

  1. 多尺度特征表达 :通过小波变换捕获目标的结构、纹理、边缘等多尺度特征
  2. 强抗噪能力:小波阈值去噪与稀疏约束的双重机制,显著提升对相干斑噪声的鲁棒性
  3. 小样本适应性:稀疏表示在低维流形上的表达能力,减少对大规模训练数据的依赖
  4. 物理可解释性:小波基的选择与目标散射特性相匹配,增强算法的物理意义
相关推荐
吴可可1231 小时前
CAD2004自定义实体开发环境配置
c++·算法
装不满的克莱因瓶1 小时前
矩阵的主成分是什么?主成分分析(PCA)又能做什么?
人工智能·线性代数·算法·机器学习·ai·矩阵·pca
大菜菜小个子1 小时前
template<typename T>使用
java·开发语言·算法
Fanfanaas2 小时前
C++ 继承
java·开发语言·jvm·c++·学习·算法
lqqjuly2 小时前
模型合并与融合:理论、算法与可运行实现—从损失曲面几何到多模型融合
算法
memcpy02 小时前
LeetCode 2144. 打折购买糖果的最小开销【贪心】
算法·leetcode·职场和发展
散峰而望3 小时前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
暗夜猎手-大魔王3 小时前
转载--Hermes Agent 04 | Agent 主循环:一次对话背后发生了什么
人工智能·python·算法
手写码匠3 小时前
华为云Flexus+DeepSeek征文|基于华为云Flexus X实例 + Dify + DeepSeek 构建企业级智能知识库问答系统实战
人工智能·深度学习·算法·aigc